传送门: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子