NOIP2014解方程

bzoj数据太神了WA掉了,CCF给的官方数据轻松100了,虽然bzoj上ai的大小大了些但怀疑是不是素数问题TAT==,不管了等到noip过完再补坑?对了谁能告诉我为什么devc++有时候没有一些头文件也能输出正确的解比如cstring没写但是本地就这样AC了,洛谷也AC了,然而bzoj编译错误了QAQ

很明显模素数p然后检查,如果不行那说明x+p*i都是不行的,筛掉就好

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#define N 105
#define M 1000005
#define S 10005
#define LL long long
using namespace std;
const int prime[]={10007,10917,30071};
int anss[M],ans[M],n,m;
LL a[N][5];

void readdata(int x)
{
     char s[S];int f=1;
     scanf("%s",s);
     int len=strlen(s);
     if (s[0]=='-') f=-1;
     for (int i=0;i<len;i++)
          if (s[i]!='-')
              for (int j=0;j<3;j++)
                  a[x][j]=(abs(a[x][j]*10)+s[i]-'0')%prime[j]*f;
     }
     
LL calc(int x,int y)
{
            LL t=a[n][y];
            for (int i=n-1;i>=0;i--)
                t=(t*x+a[i][y])%prime[y];
//            cout<<x<<' '<<y<<' '<<t<<endl;
            return t;
            }     
     
void sai(int x,int y)
{     
     int t=0;
     while (x+t*prime[y]<=m)
     {
           anss[x+t*prime[y]]=0;
           t++;
           }
     }
     
int check(int x)
{
     if (!anss[x]) return 0;     
     for (int i=0;i<3;i++)
         if (calc(x,i)) 
         {
                         sai(x,i);
                         return 0;
                         }
     return 1;
     }
     
int main()
{
    freopen("data.in","r",stdin);
    freopen("equ.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=0;i<=n;i++) readdata(i);
    memset(anss,1,sizeof(anss));
    for (int i=1;i<=m;i++)
        if (check(i))
        {
                     ans[++ans[0]]=i;
                     }
    for (int i=0;i<=ans[0];i++)
        printf("%d\n",ans[i]);
    return 0;
}
                                  


你可能感兴趣的:(noip)