洛谷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 }
时间: 2024-11-08 17:22:21