P2312 解方程

巧了我就是萌 提交于 2019-11-29 16:13:16

题面:https://www.luogu.org/problem/P2312

本题只要了解秦九昭算法就可解,即:
把一个n次多项式
f(x)=A[n]*x^n+A[n-1]*x^(n-1)+...+A[1]*X+A[0]
改写成如下形式:
f(x)=(...((A[n]*x+A[n-1])*x+A[n-2])*x+...+A[1])*x+A[0]
求多项式的值时,首先计算最内层括号内一次多项式的值
然后由内向外逐层计算一次多项式的值
这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。

Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=1000005,M=105,p=1000000007;
bool delta=true;
int n,m,ans,len,sum=0;
int a[M],solutions[N];
long long read(){
    long long sum=0,minus=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-'){
            minus=-1;
        }
        c=getchar();
    }
    while(c >='0' && c <='9'){
        sum=((sum*10)+c-'0')%p;
        c=getchar();
    }
    return sum*minus;
}
void print(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        print(x/10);
    }
    putchar(x%10+'0');
}
bool calc(long long x){
    sum=0;
    for(long long i=n;i>=1;i--){
        sum=((a[i]+sum)*x)%p;
    }
    sum=(sum+a[0])%p;
    return sum==0;
}
int main(){
    n=read();
    m=read();
    for(long long i=0;i<=n;i++){
        a[i]=read();
    }
    for(long long i=1;i<=m;i++){
        if(calc(i)){
            delta=false;
            ans++;
            solutions[++len]=i;
        }
    }
    if(delta){
        print(ans);
        return 0;
    }
    print(ans);
    printf("\n");
    for(long long i=1;i<=len;i++){
        print(solutions[i]);
        printf("\n");
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!