1. 程式人生 > >『NOIP 2014』解方程

『NOIP 2014』解方程

getc ios 解方程 space 最終 class name long pri

題目鏈接 for Luogu

題目描述

已知多項式方程:

\(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)

求這個方程在 \([1,m]\) 內的整數解(\(n\)\(m\) 均為正整數)。



解題思路

我們對公式進行化簡(\(L_aT^ex\)警告):

? \(a_nx^n+a_{n-1}x^{n-1}+a_{n-2}x^{n-2}+\cdots+a_0\)

\(=x(a_nx^{n-1}+a_{n-1}x^{n-2}+a_{n-2}x^{n-3}+\cdots+a_1)+a2\)

\(=x(x(a_nx^{n-2}+a_{n-1}x^{n-3}+a_{n-2}x^{n-4}+\cdots+a_2)+a_1)+a2\)

\(=\cdots\)

也就是秦九韶算法,,,

我們可以用這個方法求值,但是顯然會爆炸,用高精度得T飛。

所以我們可以每次都取模,然後判斷最終答案是不是0。我們還可以多取幾個模數,保證準確性。



代碼(只能在luogu上過哦qwq)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int mod=1000000007;
const int maxn=150;
int n,m,cnt=0;
int a[maxn],ans[1000050];
inline void read(register int &x){
    x=0; register char ch=getchar();
    int f=1;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){
        x=((long long)x*10+ch-'0')%mod;
        ch=getchar();
    }
    x*=f;
}
inline bool check(int x){
    long long y=a[n];
    for(register int i=n-1;i>=0;i--){
        y=(y*(long long)x+a[i])%mod;
    }
    return y==0;
}
int main(){
    scanf("%d%d",&n,&m);
    for(register int i=0;i<=n;i++)read(a[i]);
    for(register int i=1;i<=m;i++){
        if(check(i))ans[++cnt]=i;
    }
    printf("%d\n",cnt);
    for(register int i=1;i<=cnt;i++){
        printf("%d\n",ans[i]);
    }
}

『NOIP 2014』解方程