BZOJ 3933 CQOI2015 多项式 高精度

来源:互联网 发布:网络光纤传输器 编辑:程序博客网 时间:2024/06/08 08:46

题目大意戳这里
用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;}
0 0
原创粉丝点击