首页 > 代码库 > 求第n行杨辉三角(n很大,取模

求第n行杨辉三角(n很大,取模

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 typedef  long long ll;
 6 const int maxn=1000;
 7 ll mod;int n;
 8 ll c[100000],A[100000];
 9 void init(){
10     A[1]=1;
11     ll p=mod;
12         //线性求逆元
13     for(int i=2;i<=n;++i){
14         A[i] = ((p-(p / i)) * A[p % i]%p+p)%p;
15     }
16     c[0]=1;
17     printf("1->");
18     for(int i=1;i<=n;++i){
19                //先c[i-1]*(n-i+1),否则c[i-1]可能不整除i
20         c[i]=(((c[i-1]*(n-i+1)%p)*A[i]))%p;
21         printf("%lld->",c[i]);
22     }
23     printf("\n");
24 }
25 int main(){
26     while(~scanf("%d",&n)){
27         mod=1e9+7;
28         init();
29     }
30     return 0;
31 }

为什么不能算出来取模而用逆元呢

因为我们还要通过该结果递推其他的项,直接取模可能造成后面的数不整除前面的项

如果只算一项,取模是可以的

或者只取模一次,那么可以直接对结果取模

算逆元时一定要考虑式子对逆元的整除性

求第n行杨辉三角(n很大,取模