解方程 NOIP2014 提高组 Day2 T3

来源:互联网 发布:mac os 10.9 安装u盘 编辑:程序博客网 时间:2024/05/29 18:50

洛谷 P2312 解方程

题目描述

已知多项式方程:

a0+a1x+a2x^2+..+anx^n=0

求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)

输入输出格式

输入格式:
输入文件名为equation .in。

输入共n + 2 行。

第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。

接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an

输出格式:
输出文件名为equation .out 。

第一行输出方程在[1, m ] 内的整数解的个数。

接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。

输入输出样例

输入样例#1:
2 10
1
-2
1
输出样例#1:
1
1
输入样例#2:
2 10
2
-3
1
输出样例#2:
2
1
2
输入样例#3:
2 10
1
3
2

输出样例#3:
0
说明

30%:0 < n<=2,|ai|<=100,an!=0,m<100

50%:0< n<=100,|ai|<=10^100,an!=0,m<100

70%:0< n<=100,|ai|<=10^10000,an!=0,m<10000

100%:0< n<=100,|ai|<=10^10000,an!=0,m<1000000

思路:当f(x) = 0时, f(x) mod p = 0. 那么当f(x) mod p = 0时f(x)就有可能为0,我们可以通过取模运算将大数化小来求,但这有很大风险,所以可以通过模多个数来最终结果(选的模数很关键,有时候就算你模了很多也还是有几率出错,这就要看运气了,尽量选些不常见的质数来模)。

题解:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int mod[5]={11261,19997,22877,21893,14843};//取的模数很重要,多取几个比较保险。int a[105][5];char s[1000005];bool re[1000005];bool re2[1000005][5];int read(int Mod){    int l=strlen(s+1);    int sum=0;    if(s[1]=='-')    {        for(int i=2;i<=l;i++)        {            sum=((sum%Mod)*10)%Mod;            sum=((sum%Mod)+(s[i]-'0'%Mod))%Mod;        }        return -sum;    }    else    {        for(int i=1;i<=l;i++)        {            sum=((sum%Mod)*10)%Mod;            sum=((sum%Mod)+(s[i]-'0'%Mod))%Mod;        }        return sum;    }}int main(){    memset(re,1,sizeof(re));    memset(re2,1,sizeof(re2));    int n,m;    scanf("%d%d",&n,&m);    for(int i=0;i<=n;i++)    {    scanf("%s",s+1);    for(int j=0;j<5;j++)     {        a[i][j]=read(mod[j]);    }    }    for(int k=0;k<5;k++)    {        int Mod=mod[k];        for(int j=0;j<Mod;j++)        {            int ans=0;            for(int i=n;i>=0;i--)            {                ans=(ans*j+a[i][k])%Mod;            }            if(ans)            {                re2[j][k]=0;            }        }    }    int tot=0;    for(int i=1;i<=m;i++)//枚举1m     {        for(int j=0;j<5;j++)        {            if(!re2[i%mod[j]][j])//有一个数不满足那这个答案就被否了            {                re[i]=0;                break;            }        }        if(re[i])        {            tot++;        }    }    printf("%d\n",tot);    for(int i=1;i<=m;i++)    {        if(re[i])        {        printf("%d\n",i);           }       }    return 0;}
0 0
原创粉丝点击