http://www.bnuoj.com/v3/contest_show.php?cid=9358#problem/B
题意就不再复述了,比较容易理解
这道题我推了半天公式没推出来
赛后发现是因为当时有一个没有约分导致之后的猜想错误
这道题在这场比赛中是由我们学校的大二的张航学长一血的
十分佩服
其实公式也不是特别难推
找规律应该能找到
其实我都找了一半了
最后因为没有约分进入了错误的猜想
其实找到通项公式之后就是一连串的求就好了
通项公式这里不好写
看我代码理解吧
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3;
const ll M=1e9+7;
ll inv[N+10],A[N+10],B[N+10],ANS[N+10];
int main(){
int T;
cin>>T;
inv[0] = 0;
inv[1] = 1;
for(int i=2;i<N;++i){
inv[i]=(M-M/i*inv[M%i]%M)%M;
}
while(T--){
ll n,k;
cin>>n>>k;
for(int i=1;i<=n;++i)
cin>>A[i];
B[1]=k;
for(int i=2;i<=n;++i){
B[i]=B[i-1]*(k+i-1)%M*inv[i]%M;
}
ANS[1]=A[1];
for(int i=2;i<=n;++i){
ll lin=0;
for(int j=1;j<i;++j)
lin+=B[i-j]*ANS[j]%M;
ANS[i]=((A[i]-lin+M)%M+M)%M;
}
cout<<ANS[1];
for(int i=2;i<=n;++i)
cout<<" "<<ANS[i];
cout<<endl;
}
}