Arab Collegiate Programming Contest 2012 J- Math Homework

思路:因为只有1-6这几个数,而这几个数的最小公倍数是60,因此只须要求出60之内有多少知足条件的数便可。ide

再就是求出对于给定的n,求出60的倍数。而后就是怎样求的问题了。spa

首先能够写成以下形式:code

               10n-40=60*n (把最后的40个数去掉,最后在求结果的时候再加上)blog

               n=(10n-40)/60. (结果必定能够整除)io

代码以下:event

 

 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 }
View Code
相关文章
相关标签/搜索