思路:因爲只有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 }