某模拟题

https://www.luogu.org/problemnew/show/U16301
只出了30%的数据
但是不好想
这个涉及到高阶等差数列
但是前置知识非常浅显
我们只需要求出数列中前后两项的差值构成一个新的数列
然后这个数列为低一阶的数列
然后知道这个数列变成一阶等差数列
然后就求出这个多项式的函数中的最高项和最高项系数
然后依次求出低一项的系数

还有另外一种做法是利用高阶方程求解方程的每一个系数
方程
(a_k x^k+a_{k-1}a^{k-1}+cdots cdots a_1x+a_0=S_1,x=1)
(a_k x^k+a_{k-1}a^{k-1}+cdots cdots a_1x+a_0=s_2,x=2)
(cdots)
(cdots)
(a_k x^k+a_{k-1}a^{k-1}+cdots cdots a_1x+a_0=s_{k-1},x=k-1)
(a_k x^k+a_{k-1}a^{k-1}+cdots cdots a_1x+a_0=s_k,x=k)
(ecause n元方程组至少需要n个不同的方程才能解出一组解)
( herefore 只需要k组方程)
那么根据n阶行列式的定义及性质
(k)组方程的解({a_1,a_2,cdots cdots ,a_{k-1},a_k})
(a_i=frac{D}{D_i})
所以这个题目就解决了
求解行列式的方法有很多
复杂度有所不同
有最朴素的将行列式展开
也可以转化为三角行列式
也可以根据行列式的多种解法

所以这个复杂度比较玄学
目测可以通过最大数据

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define N 1005
using namespace std;

int maxl;
int n;
int ans[N];
int maxsum=1000;
int ss[N];
int anssum=0;

int q_pow(int x,int b) {
    int ret=1,tmp=x;
    while(b){
        if(b&1)ret=ret*tmp;
        tmp*=tmp;
        b>>=1;
    }
    return ret;
}

int digui(int s[],int nn,int sum){
    int flag=0;
    for(int i=1;i<nn;++i)
        if(s[i-1]!=s[i])
            flag=1;
    if(!flag){
        maxsum=sum;
        return s[0];
    }
    int s1[N];
    for(int i=1;i<nn;++i)
        s1[i-1]=s[i]-s[i-1];
    return digui(s1,nn-1,sum+1);
}

bool kan(){
    int flag=0;
    for(int i=0;i<n-1;++i)
        if(ss[i]!=ss[i-1])
            flag=1;
    return !flag;
}

void Quit(){
    for(int i=1;i<=maxl+1;++i)
        cout<<ans[i]<<' ';
    exit(0);
}

int fid(int i){
    int ans=1;
    for(int j=1;j<=i;++j)
        ans*=j;
    return ans;
}

int main(){
    cin>>n;
    for(int i=0;i<N&&i<n;++i)cin>>ss[i];
    while(1){
        if(!kan()){
            ans[++anssum]=digui(ss,n,0)/fid(maxsum);
            maxl=max(maxl,maxsum);
            for(int i=0;i<n;++i){
                if(maxl-anssum<0)Quit();
                ss[i]-=ans[anssum]*q_pow(i+1,maxl-anssum+1);
            }
        }
        else break;
    }
    Quit();
    return 0;
}

原文地址:https://www.cnblogs.com/qdscwyy/p/7895553.html