【NOIP2014】解方程

Description

Input

Output

Sample Input

Sample Output

题解:

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

  首先我们要使得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\n",num);

    for(int i=1;i<=num;i++) printf("%d\n",ans[i]);

}

int main()

{

    init();

    return 0;

}
时间: 2024-09-29 19:30:54

【NOIP2014】解方程的相关文章

【BZOJ 3751】 [NOIP2014]解方程

3751: [NOIP2014]解方程 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 914  Solved: 173 [Submit][Status][Discuss] Description 已知多项式方程: a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m,每两个整数之间用一个空格隔开. 接下来的n+1行每行包含一个整数,依次为a0,a1,

【bzoj3751】[NOIP2014]解方程 数论

题目描述 已知多项式方程: a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). 输入 第一行包含2个整数n.m,每两个整数之间用一个空格隔开. 接下来的n+1行每行包含一个整数,依次为a0,a1,a2,...,an. 输出 第一行输出方程在[1,m]内的整数解的个数. 接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解. 样例输入 2 10 2 -3 1 样例输出 2 1 2 题解 真心不难的数论题 首先高精度

NOIP2014解方程

题目:求一个n次整系数方程在1-m内的整数解  n<=100 系数<=10000位 m<=100W 题解:最暴力的想法是枚举x,带入求值看是否为0. 这样涉及到高精度乘高精度,高精度乘单精度,高精度加高精度和高精度减高精度. 复杂度 n*m*len*len ,显然只能过30%的数据 让我们考虑优化: 我们先来研究一下这个算法的主要耗时在哪里 1)将x带入方程左边求值 2)选择多少x带入 我们考虑第一个优化 1)秦九韶算法 只要我们把原方程左边化为 ((An*x+An-1)*x+An-2)

noip2014 解方程(本博文转载于http://blog.csdn.net/popoqqq/article/details/40984859,略有删减)

首先阿贝尔在200年前告诉我们 五次以上方程没有求根公式 于是我们只能枚举1~m 这个是100W 然后100W再加上1W位的精度 都不用运算直接就是跪…… 怎么办呢QAQ 哈希大法好! 令f(x)=an*x^n+...+a1*x^1+a0*x^0 易知若f(x)=0 则f(x) mod p=0 反之如果f(x) mod p=0 那么我们基本可以得出f(x)=0 p比较靠谱的时候碰撞率极低 所以我们把所有的ai都对p取模 然后对于每个解O(n)验证即可 这样是O(m*n)=10 8 (不是一秒么

[BZOJ 3751][NOIP2014]解方程(哈希)

Description 已知多项式方程: a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). Solution 一道很久很久以前就应该做的noip的题 一定要放上来是要见证我人品崩坏的一下午 生无可恋…QAQ 题解其实也很简单啦 随便找几个素数取模验证是不是等于0就好了 随便 随便 随便 随便找几个…素数 在WA\TLE\OLE间切换,最后还是抄了别人的几个素数 怀疑人生[望天 (BZOJ上的数据是加强了的,如果是ccf的数据那当然就随

[noip2014]解方程 hash+秦九昭

坑啊= = 选了好几次质数,发现还是这一组靠谱 思路:每次mod之后求出所有解,再mod再求,看着复杂度差不多了就把没重复的都输出就行了 const mi:array[1..7] of int64=(12537,15437,17647,14677,10003,10009,10007); var n,m,shi,sum,x:int64; i,j,k,y1:longint; a:array[-1..102,-1..10000+9] of int64; flag:array[-1..1000000+9

NOIP2014 解方程

描述 已知多项式方程: a0+a1x+a2x2+...+anxn=0a0+a1x+a2x2+...+anxn=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 格式 输入格式 输入共 n+2 行. 第一行包含 2 个整数 n.m,每两个整数之间用一个空格隔开. 接下来的 n+1 行每行包含一个整数,依次为a0,a1,a2,...,ana0,a1,a2,...,an. 输出格式 第一行输出方程在[1, m]内的整数解的个数. 接下来每行一个整数,按照从小到大的顺序依次输出方程在[

BZOJ3751 NOIP2014 解方程(Hash)

题目链接  BZOJ3751 这道题的关键就是选取取模的质数. 我选了4个大概几万的质数,这样刚好不会T 然后统计答案的时候如果对于当前质数,产生了一个解. 那么对于那些对这个质数取模结果为这个数的数也要统计进答案. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i &g

bzoj3751: [NOIP2014]解方程 数学

题解:http://www.cnblogs.com/mhy12345/p/4109764.html 我也不知道该怎么选质数才比较优越,但是可以用秦九韶算法优化常数,就容易过了. #include<bits/stdc++.h> using namespace std; int f[5]={ 16253,21139,22433,23059,27647 }; int a[5][101]; bool v[5][100000]; char t[10057]; int cnt,st[1000001]; b

【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程

在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; #define MAXV 4951 vector<int>v; typedef unsigned int ull; const u