1. 程式人生 > >2018湖南省賽B題“2018”

2018湖南省賽B題“2018”

amp class 放棄 打出 printf 決定 n) inline %d

題面懶得敲了,反正看這篇博客的肯定知道題面。

比賽時想按約數的一些性質分情況討論出公式然後在合並,結果單考慮矩陣裏出現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\n",tot); 27 } 28 return 0; 29 }

2018湖南省賽B題“2018”