• 解方程


    【题目描述】

    已知多项式方程: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
    ",num[0]);
        for (int a=1;a<=num[0];a++)
          printf("%d
    ",num[a]);
        return 0;
    }
  • 相关阅读:
    编译原理 First集和Follow集的求法
    编译原理——算符优先分析法详解
    api.js(接口文件)
    addmul.wxs(保留两位小数-将手机号中间4位数变成*-处理时间戳)
    插槽的使用
    scroll-view小程序侧边栏(点击加载右侧商品)
    Array.of
    es6解构赋值默认值结合使用
    ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
    es6 数组的新方法 some filter indexOf 展开运算符... let const
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5783751.html
Copyright © 2020-2023  润新知