xdoj 1130 A Simple Math Problem 3 組合公式

                 題意: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
****************************************************************/

      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章