某模拟题
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\)
\(\because n元方程组至少需要n个不同的方程才能解出一组解\)
\(\therefore 只需要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;
}
为什么要过别人为我安排的生活.