NOIP2014 day2第三题 解方程

题目大意:已知多项式方程: 求这个方程在[1,  m ] 内的整数解(n 和m 均为正整数)。

题解:傻逼hash题,我取了三个模数,然后把每个系数分别取模;如果a不是解那么显然a+mod也不是解。经过三重筛选以后,剩下的基本上(很大概率)就是解了(逃)。我不用秦九韶就被卡了qaq。

%%%__debug大神

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int MAXN=101,MAXM=1000001;
const int prime[] = {10007,10917,30071};
int n,m,a[MAXN+1][3],vis[MAXM],f[40000][3],cnt[MAXN];
vector<int> res;
char s[102][10010];
int Read(int p,int j)
{
    char x=0;int flag=0,c=0,sig=1,pos=0;
    while(pos<strlen(s[p]))
    {
        x=s[p][pos++];
        if(x=='-')sig=-1;
        else if(x>='0'&&x<='9')c*=10,c%=prime[j],c+=x-'0',flag=1;
        else if(flag)break;
    }
    c%=prime[j];
    return c*sig;
}
int g(int value,int j)
{
    long long tmp = 0;  
    for (int i = n; i>=0; --i)  
        tmp = (tmp * value + a[i][j]) % prime[j];  
    return tmp != 0;  
}          
int main()
{
    freopen("equation.in","r",stdin);
    freopen("equation.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=0;i<=n;i++)scanf("%s",s[i]);
    for(int j=0;j<3;j++)
        for(int i=0;i<=n;i++)
            a[i][j]=Read(i,j);
    for(int i=0;i<3;i++)
       for(int j=0;j<=prime[i];j++)
          f[j][i]=g(j,i);
    for(int i=0;i<3;i++)
       for(int j=1;j<=m;j++)
          if(f[j%prime[i]][i]!=0)
               vis[j]=1;
    for(int i=1;i<=m;i++)if(!vis[i])res.push_back(i);
    sort(res.begin(),res.end());
    int m=unique(res.begin(),res.end())-res.begin();
    printf("%d\n",m);
    for(int i=0;i<m;i++)
       printf("%d ",res[i]);
}


你可能感兴趣的:(noip)