计算系数

传送门:https://www.luogu.org/problemnew/show/P1313

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define ll long long int
 5 int p = 10007,a,b,k,n,m;
 6 ll h[1001][1001],ans;
 7 ll prepare(int k,int n)
 8 {
 9     int i,j;
10     for(i = 0;i <= k;i++)
11     {
12         for(j = 0;j <= n;j++)
13         {
14             if(i == 0 || j == 0 || j == i) h[i][j] = 1;
15             else h[i][j] = (h[i-1][j-1] + h[i-1][j])%p;
16         }
17     }
18     return h[k][n];
19 }
20 ll qpow(ll a,ll b)
21 {
22     ll ans = 1,base = a;
23     while(b)
24     {
25         if(b&1)
26             ans *= base,ans %= p;
27         base *= base,base %= p;
28         b >>= 1;
29     }
30     return ans;
31 }
32 int main()
33 {
34     scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
35     ans = ((qpow(a%p,n) * qpow(b%p,m)) % p * prepare(k,min(n,m))) % p;
36     printf("%lld",ans);
37     return 0;
38 }


不气不气真不气,上帝住在我心里。

这道题怎么算?用手算。

这道题怎么看?用眼睛看。

杨辉三角+快速幂。

在a=1&b=1的情况下手算了几个式子,发现了这个跟杨辉三角有关,并且在角的哪一行与k有关,所以预处理杨辉三角时只需要处理到第k行。至于第几列,因为它是对称的,所以取m,n中较小的那个作为处理到的列数。但是当a或b不为1时,就需要算a^n*b^m再乘上h[k][n],这样以来就用到了快速幂。第一次交只得了20分,下载了第二个数据,发现结果总是负的,原来是处理杨辉三角时数太大溢出了,zx大佬说能取模就取模,于是在能取模的地方都取了,然后就A了。

不气不气真不气,上帝住在我心里——pop子

猜你喜欢

转载自www.cnblogs.com/peppa/p/9436804.html