比賽的時候最後時間專註1010去了..最後十分鐘才想起1001應該能打表..結果沒搞得贏..賽後果斷AC阿...這題..好噁心..
其實對於這一類的N很大的問題..就要有大表找規律的思維..或者找到通項公式..或者找到遞推關係利用矩陣乘法..而本題就是..N<=30時暴力枚舉出結果..N>30...結果都是10...囧...
Program:
#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<math.h>#include<queue>using namespace std; int f[35],e[35],s[35],i,j,k,m,N,ans,l,r,m1,m2,T,t; int gcd(int a,int b){ if (!b) return a; return gcd(b,a%b);}int main(){ memset(e,0,sizeof(e)); for (i=1;i<=31;i++) for (j=1;j<=i;j++) if (gcd(i,j)==1) e[i]++; memset(f,0,sizeof(f)); for (i=1;i<=31;i++) for (j=1;j<=i;j++) if (i%j==0) f[i]++; for (N=1;N<=31;N++) { ans=0; for (l=1;l<=N;l++) for (r=l;r<=N;r++) { m1=m2=0; for (i=l;i<=r;i++) { m1+=e[i]; m2+=f[i]; } if (m1==m2) ans++; } s[N]=ans; } scanf("%d",&T); for (t=1;t<=T;t++) { scanf("%d",&i); printf("Case %d: ",t); if (i<=30) printf("%d\n",s[i]); else printf("10\n"); } return 0;}