vijos1910解方程

描述

已知多项式方程:

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]内的整数解的个数。

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

样例1

样例输入1[复制]

2 10
1
-2
1

样例输出1[复制]

1
1

样例2

样例输入2[复制]

2 10
2
-3
1

样例输出2[复制]

2
1
2

样例3

样例输入3[复制]

2 10
1
3
2

样例输出3[复制]

0

限制

对于 30%的数据,0 < n ≤ 2, |ai||ai| ≤ 100,anan ≠ 0, m ≤ 100;

对于 50%的数据,0 < n ≤ 100, |ai||ai| ≤ 1010010100 ,anan ≠ 0,m ≤ 100;

对于 70%的数据,0 < n ≤ 100, |ai||ai| ≤ 10100001010000 ,anan ≠ 0,m ≤ 10000;

对于 100%的数据,0 < n ≤ 100, |ai||ai| ≤ 10100001010000 ,anan ≠ 0,m ≤ 1000000。

来源

NOIP2014 提高组 Day2



初看本题,知道要取模一个素数但是有两个地方没考虑

1一个素数不够用,可能要出错,用5个素数就差不多了,这五个素数可以比较小10^4级就可以了

2根据题意如果f(x)=0,那么f(x+p)=0,后面的就不用算了

AC代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #define M 1000002
 4 #define N 102
 5 using namespace std;
 6 int n,m;
 7 int ans[M];
 8 int a[N][5];
 9 int t[205][5];
10 int c[25000][5];
11 int p[5]={10007,23333,11119,11777,11177};
12 int cal(int y)
13 {
14     int tmp=0;
15     for(int i=0;i<=n;i++)
16     tmp=(tmp+a[i][y]*t[i][y])%p[y];
17     if(tmp<0)//减法取余要注意可能减到负数
18         tmp+=p[y];
19     return tmp;
20 }
21 bool check(int mm)
22 {
23     for(int i=0;i<5;i++)
24     if(c[mm%p[i]][i]!=0)
25     return false;
26     return true;
27 }
28 int main()
29 {
30     cin>>n>>m;
31     for(int i=0;i<=n;i++)//读大系数
32     {
33         char ai[10005];
34         scanf("%s",ai);
35         for(int k=0;k<5;k++)
36         {
37             int factor=0;
38             int j=0;
39             if(ai[0]==‘-‘)j++;
40             for(;;j++)
41             {
42                 if(ai[j]<=‘9‘&&ai[j]>=‘0‘)
43                 factor=(factor*10+ai[j]-‘0‘)%p[k];
44                 else break;
45             }
46             if(ai[0]==‘-‘)
47             factor*=-1;
48             a[i][k]=factor;
49         }
50     }
51     for(int i=0;i<5;i++)
52     for(int j=1;j<=p[i];j++)
53     {
54         t[0][i]=1;//第一个系数为a0*x^0
55         for(int k=1;k<=n;k++)t[k][i]=(t[k-1][i]*j)%p[i];
56         c[j][i]=cal(i);
57     }
58     for(int i=1;i<=m;i++)
59     if(check(i))
60     ans[++ans[0]]=i;
61     cout<<ans[0]<<endl;
62     for(int i=1;i<=ans[0];i++)
63     printf("%d\n",ans[i]);
64     return 0;
65 }
时间: 2024-11-10 00:23:22

vijos1910解方程的相关文章

用python解方程和微积分

用python解方程: from sympy import * x = Symbol('x')  y = Symbol('y') print solve([2* x - y -3,3* x + y -7],[x, y]) 2. 求极限: 代码中的oo就代表无穷. from sympy import * n = Symbol('n') s = ((n+3)/(n+2))**n print limit(s, n, oo) 3. 求定积分: integrate函数用于积分问题. from sympy 

NOIP201410解方程(C++)

NOIP201410解方程 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知多项式方程: a0+a1*x+a2*x^2+a3*x^3+-+an*x^n=0 求这个方程在[1, m]内的整数解(n 和 m 均为正整数). 输入 输入共 n+2 行.第一行包含 2 个整数 n.m,每两个整数之间用一个空格隔开.接下来的 n+1 行每行包含一个整数,依次为a0,a1,a2-an.  输出 第一行输出方程在[1, m]内的整数解

codevs3732==洛谷 解方程P2312 解方程

P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .in. 输入共n + 2 行. 第一行包含2 个整数n .m ,每两个整数之间用一个空格隔开. 接下来的n+1 行每行包含一个整数,依次

HDU 4793 Collision --解方程

题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法).问硬币某一部分在圆形区域内的总时间. 解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0 如果有解,再看代入圆盘有

【NOIP之旅】NOIP2014 day2 T3 解方程

3.解方程 (equation.cpp/c/pas) [问题描述] 已知多项式方程: 求这个方程在[1, m]内的整数解(n和m均为正整数).   [输入] 输入文件名为equation.in. 输入共n+2行. 第一行包含2个整数n.m,每两个整数之间用一个空格隔开. 接下来的n+1行每行包含一个整数,依次为a0,a1,a2,……,an. [输出] 输出文件名为equation.out. 第一行输出方程在[1, m]内的整数解的个数. 接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,

1743: 解方程

1743: 解方程 Description 一群奥特曼打败了一群小怪兽,已知所有的奥特曼均有x1个头.y1条腿(变异奥特曼),所有的小怪兽均有x2个头.y2条腿.战场上一共有q个头,w条腿,问有多少奥特曼,有多少个小怪兽? Input 输入数据有多组每组包含6个正整数,分别为,x1,y1,x2,y2,q,w :(0<=q,w<=1000000000):输入数据保证有唯一解.读到0 0 0 0 0 0结束. Output 输出占一行,包含两个正整数,分别为:奥特曼和小怪兽的数目: Sample

解方程与高斯消元

解决多元一次方程组: n个方程n个未知数高斯消元法:思路:1.把方程未知数的系数写成一个矩阵2.消去x1,用除第一行以外的其他行减去第一行,写在原位上3.同理第二步,消去第三行的x24.原来的矩阵会变成一个上三角矩阵5.最后直接解方程*如果当前方程需要消元的位置系数是0,就把当前方程和下面第一个非0的方程换一下位置反正也不影响答案 代码实现: void gauss() { juzhen:m for(int i=1;i<=n;++i) { if(m[i][i]==0) { for(int j=i+

1402 解方程

1402 解方程 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 你曾因解麻烦的二元一次方程而烦恼吗?(其实很简单)我们现在用程序来模拟一下吧. 输入描述 Input Description 输入有两行,分别是两个一次方程,保证输入满足二元一次方程的定义:会出现小数,有效数字不会超过5位:保证有且只有一个解.未知数不一定是x和y.输出保留到小数点后10位.数据不超过maxlongint.不会出现括号.除

【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,