解方程

【题目描述】

已知多项式方程:a0+a1*x+a2*x2+······+an*xn=0,求这个方程在[1,m]内的整数解(n和m均为正整数)。

【输入描述】

输入共n+2行。

第一行输入两个整数n、m;

接下来n+1行每行包含一个整数,分别表示a0、a1、a2······an

【输出描述】

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

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

【输入样例】

样例1:

2 10

1

-2

1

 

样例2:

2 10

2

-3

1

 

样例3:

2 10

1

3

2

【输出样例】

样例1:

1

1

 

样例2:

2

1

2

 

样例3:

0

【数据范围及提示】

对于30%的数据,0 < n <= 2,|ai| <= 100,an != 0,m < 100;

对于50%的数据,0 < n <= 100,|ai| <= 10100,an != 0,m < 100;

对于70%的数据,0 < n <= 100,|ai| <= 1010000,an != 0,m < 10000;

对于100%的数据,0 < n <= 100,|ai| <= 1010000,an != 0,m < 1000000。

源代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,num[1000001],Prime[3]={10007,10917,30071};
long long i[110][5];
bool f[100000][5]={0};
char S[10001];
bool Calc(int Value, int t)
{
    long long Num=0;
    for (int a=n;a>=0;a--)
      Num=(Num*Value+i[a][t])%Prime[t];
    return Num!=0;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int a=0;a<=n;a++)
    {
        scanf("%s",S);
        int Length=strlen(S);
        int Sign=1;
        for (int L=0;L<Length;L++)
        {
            if (S[L]=='-')
              Sign=-1;
            else
              for (int b=0;b<3;b++)
                i[a][b]=(i[a][b]*10+S[L]-'0')%Prime[b];
        }
        if (Sign==-1)
          for (int b=0;b<3;b++)
            i[a][b]=Prime[b]-i[a][b];
    }
    for (int b=0;b<3;b++)
      for (int a=0;a<Prime[b];a++)
        f[a][b]=Calc(a,b);
    for (int a=1;a<=m;a++)
    {
        bool Flag(0);
        for (int b=0;b<3;b++)
          if (f[a%Prime[b]][b])
          {
            Flag=true;
            break;
          }
        if (!Flag)
          num[++num[0]]=a;
    }
    printf("%d\n",num[0]);
    for (int a=1;a<=num[0];a++)
      printf("%d\n",num[a]);
    return 0;
}

 

posted @ 2016-08-18 14:18  前前前世。  阅读(178)  评论(0编辑  收藏  举报