題意:a(n)=sum((p+i*d)*C(n,i)) % 542,求第n項a[n]的值。
題目鏈接:http://acm.xidian.edu.cn/problem.php?cid=1018&pid=1
思路:sum((p+i*d)*C(n,i) =sum(p*C(n,i)+d*i*C(n,i)) ; 又因爲 i*C(n,i) = n*C(n-1,i-1) ,所以sum((p+i*d)*C(n,i)) = sum(p*C(n,i)+d*n*(n-1,i-1)),然後i又是從0到n,C(n,0)+C(n,1)+......+C(n,n) =2^n(2的n次)。sum((p+i*d)*C(n,i) = p*2^n+d*n*2^(n-1)。還有就是需要用快速冪求2的n次。
輸入一開始拿int一直WA,改成long long 就過了,好神奇。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 1e5+100;
#define INF 0x3f3f3f3f
const int MOD=542;
LL Pow(LL a,int b)
{
LL ans=1;
while(b)
{
if(b&1) ans=ans*a%MOD;
a=a*a%MOD;
b/=2;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
LL p,d;
int n;
scanf("%lld%lld%d",&p,&d,&n);
LL ans=0;
ans=Pow(2,n);
ans=ans*p%MOD;
ans=(ans+d*n%MOD*Pow(2,n-1)%MOD)%MOD;
ans=(ans+MOD)%MOD;
printf("%lld\n",ans);
}
return 0;
}
/**************************************************************
Problem: 1130
<span id="transmark"></span>
Language: C++
Result: 正確
Time:1023 ms
Memory:1688 kb
****************************************************************/