YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目大意:

输入两个数n和m,n表示有n个数,这n个数是一个多项式的前n项,让输出这个序列的n+1,n+2,..n+m项。

题解:差分规律,一直差分,直到全为0或者只剩下一个数。然后再递推回去。

 

 给出了n个数,最多可以求n-1行差分,从最后一行向上推,共n行。所以总复杂度O(n^2+n*m).

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1E2+7;
ll dp[N][N];
void solve(int t){
//    memset(dp,0,sizeof dp); 
    ll n,c;
    cin>>n>>c;
    for(ll i=1;i<=n;i++) cin>>dp[1][i];
    if(n==1) {
        cout<<dp[1][1];
        for(ll i=2;i<=c;i++) cout<<" "<<dp[1][1]; 
        cout<<endl;
        return ;
    }
    ll pos=2;
    while(1){
        bool flag = false ;
        for(ll i=1;i<=n-pos+1;i++){
            dp[pos][i]=dp[pos-1][i+1]-dp[pos-1][i];
        }
        if(pos==n) break;
        pos++;
    }
    for(ll i=1;i<=c;i++){
        dp[n][i+1]=dp[n][i];
        for(ll j=n-1;j>=1;j--){
            dp[j][n+i+1-j]=dp[j][n+i-j]+dp[j+1][n+i-j];
        }
        if(i==1) cout<<dp[1][n+i];
        else cout<<" "<<dp[1][n+i];
    }
    cout<<endl;
}
int main(){
    ll t;
    cin>>t;
    for(int i=t;i>=1;i--) solve(i);
    return 0;
}

 

posted on 2020-03-11 15:41  Target--fly  阅读(173)  评论(0编辑  收藏  举报