zoukankan      html  css  js  c++  java
  • [秦九韶][强枚]NOIP2014day2 解方程

    题目描述

    已知多项式方程:
    a0+a1x+a2x^2+..+anx^n=0
    求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)
    

    输入输出格式

    输入共n + 2 行。
    第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。
    接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an
    

    输出格式:

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

    输入输出样例

    输入样例#1:
    2 10
    1
    -2
    1
    输出样例#1:
    1
    1
    输入样例#2:
    2 10
    2
    -3
    1
    输出样例#2:
    2
    1
    2
    输入样例#3:
    2 10
    1
    3
    2

    输出样例#3:
    0
    说明

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

    对于50%的数据:0< n<=100,|ai|<=10^100,an!=0,m<100

    对于70%的数据:0< n<=100,|ai|<=10^10000,an!=0,m<10000

    对于100%的数据:0< n<=100,|ai|<=10^10000,an!=0,m<1000000

    题解

    我们将公式化简可得
        a0+a1x+a2x^2+..+anx^n
       =a0+x(a1+a2x+a3x^3..+anx^(n-1))
       =a0+x(a1+x(a2+a3x..+anx^(n-2))
       =......
       =a0+x(a1+x(a2+x(a3+x(a4.....))
    由上的秦九韶公式求得,我们可以在枚举一个点后O(n)判断是否为0
    那么反过来看m的范围m<=1000000,n<=100
    咦!又露出了那意味声称的邪笑!
    

    这里写图片描述

    然后,这就是题水题了
    我们强枚可能的m,用O(n)判断是否为0
    (Tips:
            由于ai<=10^10000,所以我们必须模一个大质数
            最好多模几个,以免出现刚好为质数的倍数的点
            不过我一个10^9+7就够了
    )
    

    代码

    #include<cmath>
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    const int mo=1000000007;
    using namespace std;
    long long a[110],n,m,ans[1000100],cnt;
    long long read()
    {
        long long zf=1,sum=0;
        char c=getchar();
        while (c<'0'||c>'9') 
            if (c=='-') 
            {
                zf=-1;
                c=getchar();
            }
        while (c>='0'&&c<='9') sum=sum*10+c-'0',sum%=mo,c=getchar();
        return sum*zf;
    }
    long long f(long long h)
    {
        long long sum=0;
        for (long long i=n+1;i>=1;i--)
        {
            sum=sum*h+a[i];
            sum=sum%mo;
        }
        return sum;
    }
    int main()
    {
        n=read(); m=read();
        for(long long i=1;i<=n+1;i++) a[i]=read();
        for(long long i=1;i<=m;i++) if(f(i)==0) ans[++cnt]=i;
        printf("%lld
    ",cnt);
        for(long long i=1;i<=cnt;i++) printf("%lld
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    任意文件读取与下载漏洞
    命令执行与代码执行漏洞原理
    安全面试知识汇总
    科学使用Github(gayhub)搜索想要的项目
    业务逻辑漏洞--注册-登录-改密码页面总结
    Linux提权之SUID提权
    攻防世界XCTF--伪造请求头XFF和Referer(第九题)
    攻防世界XCTF--两种传输方式get_post(第八题)
    攻防世界XCTF--一个简单的PHP后端验证(第七题)
    课时14.DTD文档声明上(掌握)
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412238.html
Copyright © 2011-2022 走看看