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
相關文章
相關標籤/搜索