【NOIP2014】解方程

Description

P

Input

Output

Sample Input

P

Sample Output

P

题解:

  这个题目本来是很难的,但因为数据很水,所以就很容易水过去了。

  首先我们要使得f(x)==0,那么f(x)mod 任何数都必定是0,那么我们可以选择合适的质数,对f(x)取模,那么不包含这个质因子的所有所有数都会被我们排除,所以我们可以多尝试选出很多个质数进行检查,wa的几率就十分小了。

   然后为了算出f(x),我们必须写一个大整数取模,讲取模之后的预处理出来。然后可以用秦九韶算法来求表达式的值,这样复杂度就对了。

代码:

#include <cstdio>

#include <iostream>

#include <algorithm>

#include <cstring>

#include <cmath>

#include <iostream>

#include <vector>

#define MAXN 101000

#define MAXNm 1000000

#define ll long long

#define mod 100000000007

using namespace std;

char ch[MAXN];

ll a[200];

int ans[MAXNm],f[MAXNm],num=0,n,m;

 

bool check(int x){

    ll sum=0;

    for(int i=n;i>=0;i--){

        sum=(sum*x+a[i])%mod;

    }

    if(sum==0) return 1;

    return 0;

}

 

void init(){

    scanf("%d%d",&n,&m);

    for(int i=0;i<=n;i++){

        scanf("%s",ch+1);int len=strlen(ch+1);

        for(int j=1;j<=len;j++){

            if(ch[j]==45) {f[i]=1;continue;}

            a[i]=(a[i]*10+ch[j]-'0')%mod;

        }

        if(f[i]==1) a[i]*=-1;

    }

    for(int x=1;x<=m;x++){

        if(check(x)) ans[++num]=x;

    }

    printf("%d
",num);

    for(int i=1;i<=num;i++) printf("%d
",ans[i]);

}

 

int main()

{

    init();

    return 0;

}
原文地址:https://www.cnblogs.com/renjianshige/p/7610550.html