题目大意戳这里
用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