zoukankan      html  css  js  c++  java
  • 【NOIP2014】解方程

    Description

    P

    Input

    Output

    Sample Input

    P

    Sample Output

    P

    题解:

      这个题目本来是很难的,但因为数据很水,所以就很容易水过去了。

      首先我们要使得f(x)==0,那么f(x)mod 任何数都必定是0,那么我们可以选择合适的质数,对f(x)取模,那么不包含这个质因子的所有所有数都会被我们排除,所以我们可以多尝试选出很多个质数进行检查,wa的几率就十分小了。

       然后为了算出f(x),我们必须写一个大整数取模,讲取模之后的预处理出来。然后可以用秦九韶算法来求表达式的值,这样复杂度就对了。

    代码:

    #include <cstdio>
    
    #include <iostream>
    
    #include <algorithm>
    
    #include <cstring>
    
    #include <cmath>
    
    #include <iostream>
    
    #include <vector>
    
    #define MAXN 101000
    
    #define MAXNm 1000000
    
    #define ll long long
    
    #define mod 100000000007
    
    using namespace std;
    
    char ch[MAXN];
    
    ll a[200];
    
    int ans[MAXNm],f[MAXNm],num=0,n,m;
    
     
    
    bool check(int x){
    
        ll sum=0;
    
        for(int i=n;i>=0;i--){
    
            sum=(sum*x+a[i])%mod;
    
        }
    
        if(sum==0) return 1;
    
        return 0;
    
    }
    
     
    
    void init(){
    
        scanf("%d%d",&n,&m);
    
        for(int i=0;i<=n;i++){
    
            scanf("%s",ch+1);int len=strlen(ch+1);
    
            for(int j=1;j<=len;j++){
    
                if(ch[j]==45) {f[i]=1;continue;}
    
                a[i]=(a[i]*10+ch[j]-'0')%mod;
    
            }
    
            if(f[i]==1) a[i]*=-1;
    
        }
    
        for(int x=1;x<=m;x++){
    
            if(check(x)) ans[++num]=x;
    
        }
    
        printf("%d
    ",num);
    
        for(int i=1;i<=num;i++) printf("%d
    ",ans[i]);
    
    }
    
     
    
    int main()
    
    {
    
        init();
    
        return 0;
    
    }
  • 相关阅读:
    terminal
    变量提升、函数提升
    ssh传输文件
    mocha测试框架
    npm-run 自动化
    webpack
    浅析babel
    构建工具gulp
    C++中TRACE宏及assert()函数的使用
    memcpy函数-C语言
  • 原文地址:https://www.cnblogs.com/renjianshige/p/7610550.html
Copyright © 2011-2022 走看看