洛谷P1313 计算系数 数学 数论

洛谷P1313 计算系数
数学 数论
1、首先我们不管这个系数 a b 那么他的系数就是杨辉三角 他那项就是 c(k,n)x^n*y^m
2、然后现在加了系数 a 和 b ,那么就只要把 a 看做 x中的,然后a与x一样,相当a^n
3、可以发现,x^n*y^m项的系数一定有一个因数a^n*b^m,所以可以提取出来。
4、然后关于求C的话由两种方法,一种方法是杨辉三角 这样要 n^2 求 但数据再大点就挂了
5、然后还可以质因数分解求
6、我是用费马小定理求逆元做的,因为 mod 别的还行,除法不能直接模,得求逆元
根据欧拉定理 a^phi(mod) == 1 ( % mod ) ( gcd( a,mod ) == 1
然后推得费马小定理 a^(mod-1) == 1 ( % mod ) ( gcd( a,mod ) ==1 && mod is prime )
因为质数的phi 是 n-1 所以 a 的逆元为 a^( mod-2) a*a^(mod-1) ==1 (% mod )
7、这样逆元求出来就可以求答案了

PS a 与 b 可能一开始就已经超过 mod了,然后乘一下就爆 int 了,所以需要一开始就要 % mod
否则会炸

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdlib>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream> 
 9 using namespace std ; 
10 
11 const int mod = 10007,mod2 = 10006 ; 
12 int a,b,k,n,m,ans ; 
13 
14 inline int ksm(int base,int ind) 
15 {
16     int a[32],num = 0,sum = 1  ; 
17     while(ind) 
18     {
19         a[++num] = ind&1 ;
20         ind/=2 ; 
21     } 
22     for(int i=num;i;i--) 
23     {
24         sum = sum*sum % mod ;
25         if( a[ i ] ) sum = sum*base % mod ; 
26     }
27     return sum ;     
28     
29 }
30 
31 int main() 
32 {
33     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m ) ; 
34     a%=mod;  b%=mod ; 
35     ans = 1 ; 
36     for(int i=2;i<=k;i++) ans = ans*i % mod ;  
37     for(int i=2;i<=n;i++) ans = ( ans*ksm(i,mod-2) ) % mod ;  
38     for(int i=2;i<=m;i++) ans = ( ans*ksm(i,mod-2) ) % mod ; 
39     ans = ( ans*ksm( a,n ) % mod ) *ksm( b,m ) % mod ; 
40     printf("%d\n",ans) ; 
41     
42     return 0 ; 
43 } 

 

posted @ 2017-06-15 12:55  third2333  阅读(192)  评论(0编辑  收藏  举报