• 某模拟题


    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;
    }
    
    
  • 相关阅读:
    当前页面跳转网页,新打开和在本页面打开
    文本框内按下enter键禁止换行
    排序算法
    Java实现图片的叠加与拼接
    简单工厂模式
    单例模式
    Java实现代理模式
    调用第三方接口生成短链接(五)
    调用第三方接口生成短链接(四)
    调用第三方接口生成短链接(二)
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/7895553.html
Copyright © 2020-2023  润新知