BZOJ 3933 CQOI2015 多项式 高精度

题目大意戳这里

用x替换式子中的x-t得到:

∑nk=0ak(x+t)k=∑nk=0bkxk

于是可以得到:

bm=∑nk=mCk?mktk?mak=∑n?mi=0Cim+itiam+i

其中ai=(209?1234i 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;
}
时间: 2024-10-24 09:44:05

BZOJ 3933 CQOI2015 多项式 高精度的相关文章

bzoj 1002 [FJOI2007]轮状病毒 高精度&amp;&amp;找规律&amp;&amp;基尔霍夫矩阵

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Status] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source 基尔霍夫矩阵总算编出来了,这道题考

bzoj 3323: [Scoi2013]多项式的运算.

3323: [Scoi2013]多项式的运算 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 412  Solved: 148[Submit][Status][Discuss] Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) =

BZOJ 3931: [CQOI2015]网络吞吐量

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)中

bzoj 3932 [CQOI2015]任务查询系统 (主席树)

版权声明:本文为博主原创文章,未经博主允许不得转载. bzoj 3832 题意: 有一堆任务,每个任务都有一个起始时间和终止时间,外加一个优先级 . 查询第xi秒优先级最小的k任务的优先级的和,如果第xi秒任务数小于k,则输出所有任务的优先级的和 . 解法: 每一秒都建立一颗线段树,线段树记录该时间点每个优先级出现的次数 . 可以把每个任务拆成两部分,一个在某个时间点该优先级次数加1,另一个就是减1了,然后按时间排序,随意搞搞就行了 . code 1 #include <iostream> 2

BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<iostre

BZOJ 3930: [CQOI2015]选数

3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1130  Solved: 532[Submit][Status][Discuss] Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简

BZOJ 3931: [CQOI2015]网络吞吐量 最大流

3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3931 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短

BZOJ 3930: [CQOI2015]选数 递推

3930: [CQOI2015]选数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3930 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助

bzoj 3931: [CQOI2015]网络吞吐量(最短路+网络流)

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1194  Solved: 508 [Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先