题目
SN,陕西OI啊,作为第一次参加省选,还是很紧张的啊,当时居然连这道题都只写了80分的,而且还挂成了50分233,宝宝心里苦啊。。。
最后,成功被卡线rk10,就这样与省队失之交臂了,好可惜啊。。
然后过了,一个月,打算再写一写,发现。。woc,不就是一个矩阵吗233。但是居然认为不是线性的递推式就不能做,还是太年轻啊。然后,比较麻烦地推了推矩阵,过了大样例。。但苦于SNOI没有数据流出233,只能对拍了,但由于暴力的“标程”,不能算太大的,不知是否会玄学爆int。。
至少,对拍了十多分钟,都是对的,就当作是对的了吧。。。
之后,发现今天bzoj上居然有数据了,测一发,居然一遍过了233。
怕是由于递推而没有进省队的我呀233。
贴一个程序吧。
#include
#define LL long long
using namespace std;
const LL mod=1e9+7;
LL n,k;
LL s[1000001];
LL fac[101],inv[101];
struct cube{
int h;
int l;
int v[15][15];
};
LL mul(LL A,LL B)
{
int fl=0;
if(A<0)fl++,A=-A;
if(B<0)fl++,B=-B;
LL Ans=0;
while(B)
{
if(B&1)Ans=(Ans+A)%mod;
B=B>>1;
A=(A+A)%mod;
}
if(fl&1)Ans=-Ans;
return Ans;
}
LL ksm(LL A,LL B)
{
LL Ans=1;
while(B)
{
if(B&1)Ans=mul(Ans,A);
B=B>>1;
A=mul(A,A);
}
return Ans;
}
void init()
{
fac[0]=1;
for(int i=1;i<=100;i++)
fac[i]=(fac[i-1]*i)%mod;
for(int i=0;i<=100;i++)
inv[i]=ksm(fac[i],mod-2);
}
void cube_mul(cube A,cube B,cube &C)
{
C.h=A.h,C.l=B.l;
for(int i=1;i<=C.h;i++)
for(int j=1;j<=C.l;j++)
C.v[i][j]=0;
for(int i=1;i<=C.h;i++)
for(int j=1;j<=C.l;j++)
for(int k=1;k<=A.l;k++)
C.v[i][j]=(C.v[i][j]+mul(A.v[i][k],B.v[k][j]))%mod;
}
void cube_ksm(cube A,LL B,cube &Ans)
{
Ans.h=Ans.l=A.h;
for(int i=1;i<=Ans.h;i++)
for(int j=1;j<=Ans.l;j++)
Ans.v[i][j]=0;
for(int i=1;i<=Ans.h;i++)Ans.v[i][i]=1;
while(B)
{
if(B&1)cube_mul(A,Ans,Ans);
B=B>>1;
cube_mul(A,A,A);
}
}
LL C(LL A,LL B)
{
return mul(mul(fac[A],inv[B]),inv[A-B])%mod;
}
void get_cube(cube &A,cube &B)
{
A.h=A.l=k+2;
for(int i=1;i<=A.h;i++)
for(int j=1;j<=A.l;j++)
A.v[i][j]=0;
A.v[1][1]=2,A.v[2][1]=1;
for(int i=2;i1][i]=1;
A.v[A.h][A.h]=1;
B.h=1,B.l=k+2;
for(int i=1;i<=B.l;i++)
B.v[1][i]=0;
B.v[1][1]=1;
for(int i=2;i<=k+2;i++)
{
for(int j=1;j1,j+1);
y=C(i-2,j-1);
z=ksm(i-j+1,k);
B.v[1][i]=(B.v[1][i]+x*y*z)%mod;
}
}
}
cube A,B;
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>k;
init();
if(n==1){
cout<<1;
return 0;
}
get_cube(B,A);
cube_ksm(B,n-2,B);
cube_mul(A,B,A);
LL k1=A.v[1][1];
get_cube(B,A);
cube_ksm(B,n-1,B);
cube_mul(A,B,A);
LL k2=A.v[1][1];
cout<<(k2-k1+mod)%mod;
return 0;
}
跑得好慢啊。。。