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;
    }
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412238.html
Copyright © 2011-2022 走看看