Arab Collegiate Programming Contest 2012 J- Math Homework
思路:由于只有1-6这几个数,而这几个数的最小公倍数是60,所以只需要求出60以内有多少满足条件的数即可。
再就是求出对于给定的n,求出60的倍数。然后就是怎样求的问题了。
首先可以写成如下形式:
10n-40=60*n (把最后的40个数去掉,最后在求结果的时候再加上)
n=(10n-40)/60. (结果一定可以整除)
代码如下:
1 #include<cstdio> 2 #define ll long long 3 #define mod 1000000007 4 ll pw(ll a,ll b) 5 { 6 ll ans=1; 7 while(b){ 8 if(b&1) ans=ans*a%mod; 9 b>>=1; 10 a=a*a%mod; 11 } 12 return ans; 13 } 14 int main() 15 { 16 int i,j,t; 17 ll n; 18 char str[10]; 19 bool f[61]; 20 scanf("%d",&t); 21 while(t--){ 22 scanf("%I64d %s",&n,str); 23 for(i=0;i<60;i++){ 24 f[i]=1; 25 for(j=0;j<6;j++){ 26 if(str[j]=='0'&&i%(j+1)==0) f[i]=0; 27 else if(str[j]=='1'&&i%(j+1)!=0) f[i]=0; 28 } 29 } 30 int c=0; 31 if(n==1){ 32 for(i=0;i<=9;i++) c+=f[i]; 33 printf("%d\n",c); 34 continue; 35 } 36 for(i=0;i<60;i++) c+=f[i]; 37 ll p=pw(10,n); 38 ll ans=(p-40+mod)%mod*pw(60,mod-2)%mod; 39 ans=ans*c%mod; 40 for(i=0;i<40;i++) ans+=f[i]; 41 printf("%I64d\n",ans); 42 } 43 return 0; 44 }