题面懒得敲了,反正看这篇博客的肯定知道题面。
比赛时想按约数的一些性质分情况讨论出公式然后在合并,结果单考虑矩阵里出现2018和1009(与2互质,1009出现次数等于2)出现的情况就写了一长串公式,还推了很久。在考虑1出现的综合情况就直接GG了。。
然后想到打表,奈何队友卡H题很久,最终因时间原因放弃来做B的时候已经冷静不下来了,没能打表成功,于是今天决定补一手打表。
我首先敲了dfs暴搜二维数组的,然后类比的(找了半天BUG)终于成功打出来了。。还是要好好练练打表,比赛卡这样的题真难受。
1 #include<cstdio> 2 #define ll long long 3 ll tot; 4 int a[]={2018, 1009 , 2, 1}; 5 int m[100][100]; 6 int n,k; 7 inline int gcd(int a,int b){return b?gcd(b,a%b):a;} 8 void dfs(int x,int y) 9 { 10 if(x>=n){tot++;return ;} 11 for(int j=0;j<4;j++) 12 { 13 if(x>0&&gcd(m[x-1][y],a[j])!=a[j])continue; 14 if(y>0&&gcd(m[x][y-1],a[j])!=a[j])continue; 15 m[x][y] = a[j]; 16 if(y+1==k)dfs(x+1,0); 17 else dfs(x,y+1); 18 if(!x&&!y)break; 19 } 20 } 21 int main() 22 { 23 while(~scanf("%d%d",&n,&k)){ 24 tot = 0; 25 dfs(0,0); 26 printf("tot: %lld ",tot); 27 } 28 return 0; 29 }