BZOJ 3933 CQOI2015 多项式 高精度

题目大意戳这里
用x替换式子中的x-t得到:
nk=0ak(x+t)k=nk=0bkxk
于是可以得到:
bm=nk=mCkmktkmak=nmi=0Cim+itiam+i
其中 ai=(2091234i mod 3388+3181) mod 3389
然后。。。出题人我*尼玛。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const long long power_10[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
struct Big_Int{
    #define BASE 1000000000ll
    long long num[2020];int cnt;
    Big_Int() {}
    Big_Int(long long _)
    {
        memset(num,0,sizeof num);
        num[cnt=1]=_;
    }
    friend istream& operator >> (istream &_,Big_Int &x)
    {
        static char s[3030];
        scanf("%s",s+1);
        int i,len=strlen(s+1);
        for(i=len;i;i--)
            x.num[(len-i)/9+1]+=(s[i]-'0')*power_10[(len-i)%9];
        x.cnt=len/9+1;
        return _;
    }
    Big_Int& operator += (const Big_Int &x)
    {
        int i;
        cnt=max(cnt,x.cnt);
        for(i=1;i<=cnt;i++)
        {
            num[i]+=x.num[i];
            if(num[i]>=BASE)
                num[i]-=BASE,num[i+1]++;
        }
        if(num[cnt+1]) ++cnt;
        return *this;
    }
    friend Big_Int operator + (const Big_Int &x,const Big_Int &y)
    {
        Big_Int re;
        re=x;re+=y;return re;
    }
    friend int operator - (const Big_Int &x,const Big_Int &y)
    {
        int i;
        long long re=0;
        for(i=x.cnt;i;i--)
            (re*=BASE)+=x.num[i]-y.num[i];
        return re;
    }
    /* friend Big_Int operator - (const Big_Int &x,int y) { Big_Int re; int i; re=x;re.num[1]-=y; for(i=1;re.num[i]<0;i++) re.num[i]+=BASE,re.num[i+1]--; while(!re.num[re.cnt]) re.cnt--; return re; } */
    friend Big_Int operator * (const Big_Int &x,const Big_Int &y)
    {
        Big_Int re(0);
        int i,j;
        for(i=1;i<=x.cnt;i++)
            for(j=1;j<=y.cnt;j++)
            {
                re.num[i+j-1]+=x.num[i]*y.num[j];
                if(re.num[i+j-1]>=BASE)
                    re.num[i+j]+=re.num[i+j-1]/BASE,re.num[i+j-1]%=BASE;
            }
        re.cnt=x.cnt+y.cnt;
        if(!re.num[re.cnt])
            re.cnt--;
        return re;
    }
    Big_Int& operator *= (const Big_Int &x)
    {
        return *this=*this*x;
    }
    Big_Int& operator /= (int x)
    {
        int i;
        for(i=cnt;i;i--)
            num[i-1]+=(num[i]%x)*BASE,num[i]/=x;
        num[0]=0;
        if(!num[cnt])
            --cnt;
        return *this;
    }
    int operator % (int x) const
    {
        int i;
        long long re=0;
        for(i=cnt;i;i--)
            ((re*=BASE)+=num[i])%=x;
        return re;
    }
    friend ostream& operator << (ostream &_,Big_Int &x)
    {
        int i;
        while( x.cnt>0 && !x.num[x.cnt] )
            --x.cnt;
        printf("%d",(int)x.num[x.cnt]);
        for(i=x.cnt-1;i>0;i--)
            printf("%09d",(int)x.num[i]);
        return _;
    }
}n,m,ans,C=1,_t=1;
int t;
int Quick_Power(int x,int y)
{
    int re=1;
    while(y)
    {
        if(y&1) (re*=x)%=3389;
        (x*=x)%=3389; y>>=1;
    }
    return re;
}
int A(const Big_Int x)
{
    int temp=x%3388;
    return (209*Quick_Power(1234,temp)+3181)%3389;
}
int main()
{
    int i;
    cin>>n>>t>>m;
    int temp=n-m;
    for(i=0;i<=temp;i++)
    {
        if(i)
        {
            C*=m+i;
            C/=i;
            _t*=t;
        }
        ans+=C*_t*A(m+i);
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(高精度,bzoj,BZOJ3933)