题意:对于杨辉三角形的第n行,首先但看每一位,将其补成长度为k的数(左补0),然后将这一行连起来作为一个大数,求这个大数mod m。
题解:数学公式推导题
1、补0实际上就是使得这个数左边的那个数乘以10的次方,那么最后答案就是Σ(C(n,m)*10^( (n-m)*k ) )%m
2、10^(n-m)k=(10^k)^(n-m),又有个C(n,m),正好组成二项式(1+10^k)^n的展开式
3、于是两个快速幂取模就可以解决了。
PS:不知样例有多少,这种复杂度也能达到500MS+,快速幂取模写怂了的没准还过不了= =!
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long LL; 6 LL fastmod(LL a,LL b,LL m) 7 { 8 LL re = 1, y = a%m; 9 for(; b; b>>=1,y=y*y%m) 10 if (b&1ll)re =y*re%m; 11 return re; 12 } 13 int main() 14 { 15 int T; 16 for(scanf("%d",&T);T;T--) 17 { 18 LL n,m,k; 19 scanf("%lld%lld%lld",&n,&k,&m); 20 printf("%lld\n",fastmod((fastmod(10ll,k,m)+1ll)%m,n,m)); 21 } 22 return 0; 23 }