zoukankan      html  css  js  c++  java
  • 解方程

    【问题述】

    已知多项式方程:

     

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

     

    【输入】

    输入文件名为equation.in。

    输入共n+2行。

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

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

     

    【输出】

    输出文件名为equation.out。

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

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

     

    【输入输出样例1】

    equation.in

    equation.out

    2 10

    1

    -2

    1

     

    1

    1

     

    【输入输出样例2】

    equation.in

    equation.out

    2 10

    2

    -3

    1

     

    2

    1

    2

     

    【输入输出样例3】

    equation.in

    equation.out

    2 10

    1

    3

    2

     

    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。


    思路:

    有点高精度的意思,但又不全是高精度。

    看数据,|ai|≤1010000 ,说实话吓到我了,但其实没什么可怕的

    我们将该方程倒过来:

        anxn+……a2x2+a1x+a0=0

    就是我们熟悉的格式了~个鬼

    意思就是这样,既然数据那么大,我们就要想办法减小数据,在一个可控范围,于是:

    (anxn+……a2x2+a1x+a0)%P=0%P

    不影响最终结果

    要做到我们需要用快读来取模,因为我们需要把这么大的数读进来

    另一个优化:秦九昭算法

    可以较小的时间复杂度,算出最终答案

    代码^-^

    #include<stdio.h>
    #include<algorithm> 
    #define ll long long  
    using namespace std;
    const int P=1e9+7;
    ll n,m,cnt,a[101],ans[1000001];
    
    ll read()
    {
        ll s=0,j=1;
        char ch=getchar();
        while(ch<'0' || ch>'9') {
            if(ch=='-') j=-1;
            ch=getchar();
        }
        while(ch>='0' && ch<='9') {
            s=(s*10+ch-'0')%P;
            ch=getchar(); 
        }
        return s*j;
    }
    
    bool qin(int x)
    {
        ll sum=0;
        for(int i=n;i>=0;--i) {
            sum=((sum+a[i])*x)%P;
        }
        return !sum;
    }
    
    int main()
    {
        n=read(),m=read();
        for(int i=0;i<=n;++i) a[i]=read();
        for(int i=1;i<=m;++i) {
            if(qin(i))
                ans[++cnt]=i;
        }
        if(!cnt) {
            printf("0");
        }
        else {
            printf("%d
    ",cnt);
            for(int i=1;i<=cnt;++i) printf("%d
    ",ans[i]);
        }
        return 0;
    }
    从0到1很难,但从1到100很容易
  • 相关阅读:
    Linux文件与文件系统的压缩
    Linux命令与文件查找
    js兼容pc和移动端的简单拖拽效果
    图片懒加载插件
    css小特效
    创建对象和方法
    距离2021年春节还剩。。。
    固定尺寸的图片焦点图案例
    数据库操作
    简单sql操作
  • 原文地址:https://www.cnblogs.com/qseer/p/9618801.html
Copyright © 2011-2022 走看看