NOIp 2014 #5 解方程 Label:数论?
题目描述
已知多项式方程:
a0+a1x+a2x^2+..+anx^n=0
求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)
输入输出格式
输入格式:
输入文件名为equation .in。
输入共n + 2 行。
第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。
接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an
输出格式:
输出文件名为equation .out 。
第一行输出方程在[1, m ] 内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。
输入输出样例
2 10 1 -2 1
1 1
2 10 2 -3 1
2 1 2
2 10 1 3 2
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
代码
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define ll long long 6 using namespace std; 7 8 ll v[555],a[555],ans,N,M,p; 9 10 ll pow(ll x,ll n){ 11 ll ans=1; 12 while(n){ 13 if(n&1) ans=ans*x; 14 x=x*x; 15 n>>=1; 16 } 17 return ans; 18 } 19 20 ll cc(ll x){ 21 ll ans=a[0]; 22 for(ll i=1;i<=N;i++){ 23 ans+=a[i]*pow(x,i); 24 } 25 if(ans==0) { 26 v[++p]=x; 27 return 1; 28 } 29 return 0; 30 } 31 32 int main(){ 33 // freopen("equation.in","r",stdin); 34 // freopen("equation.out","w",stdout); 35 36 37 scanf("%lld%lld",&N,&M); 38 for(ll i=0;i<=N;i++){ 39 scanf("%lld",&a[i]); 40 } 41 42 for(ll i=1;i<=M;i++){ 43 if(cc(i)) ++ans; 44 } 45 46 printf("%lld\n",ans); 47 for(ll i=1;i<=p;i++) printf("%lld\n",v[i]); 48 49 return 0; 50 }不会写,水过了30分,QAQ
转载:
没有c++题解,果断来一发
50%数据:
从1到m暴力枚举答案,然后通过高精度进行计算。
70%数据:
仍然从1到m暴力枚举答案,但是我们不再进行高精度运算,而是模质数。为了减小冲突的几率,我们可以多选几个数字去模。这样时间复杂度是O(nmprime),其中prime是选取的质数的数量,选四五个就行。
100%数据:
如果我们模的数字是k。左边式子带入x和带入x+k是没有区别的。如果我们把质数k取得小一些,这样x就不用试1~m,而是试1~k。这样复杂度就变成了O(nkprime),如果k取10^4左右就完全没有问题。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 using namespace std; 7 #define PROB "equation" 8 #define MAXN 1100001 9 ifdef WIN32 10 11 #define LL "%I64d" 12 #else 13 #define LL "%lld" 14 #endif 15 typedef long long qword; 16 const int mod[5] = 17 {22861,22871,22877,22901,22907 18 }; 19 int a[11][110]; 20 bool ok[MAXN]; 21 bool ok2[5][30000]; 22 char s[10010]; 23 int n,m; 24 void work(); 25 int main() 26 { 27 int ii,i,j, k; 28 int x; 29 scanf("%d%d\n",&n,&m); 30 int ll = 4; 31 for (ii=0;ii<=n;ii++) 32 { 33 // scanf("%s", s); 34 fgets(s,sizeof(s),stdin); 35 int l = strlen(s)-1; 36 if((s[l-1]<'0' || s[l-1]>'9') && s[l-1]!='-')l--; 37 for(int j = 0; j < ll; j ++){ 38 int pmod = mod[j]; 39 a[j][ii] =0; 40 x=1; 41 k=0; 42 if (s[k]=='-')k++,x=-x; 43 else if (s[k]=='+')k++; 44 for (;k<l;k++) 45 { 46 a[j][ii]=(a[j][ii]*10+s[k]-'0')%pmod; 47 } 48 a[j][ii]=a[j][ii]*x%pmod; 49 if(a[j][ii] < 0) 50 a[j][ii] += pmod; 51 } 52 } 53 memset(ok,1,sizeof(ok)); 54 memset(ok2,1,sizeof(ok2)); 55 int pmod; 56 int ans; 57 for (ii=0;ii<ll;ii++) 58 { 59 pmod=mod[ii]; 60 for (i=0;i<pmod;i++) 61 { 62 ans=0; 63 for (j=n;j>=0;j--) 64 { 65 ans=(ans * i + a[ii][j])%pmod; 66 } 67 if (ans) 68 { 69 ok2[ii][i]=false; 70 } 71 } 72 } 73 int cnt = 0; 74 for (int i=1;i<=m && cnt <= n;i++) 75 { 76 for (int j=0;j<ll;j++) 77 { 78 if (!ok2[j][i%mod[j]]){ 79 ok[i]=false; 80 break; 81 } 82 } 83 if(ok[i]) 84 ++ cnt; 85 } 86 printf("%d\n",cnt); 87 for (i=1;i<=m;i++) 88 if (ok[i]) 89 printf("%d\n",i); 90 return 0; 91 }
转载于:https://www.cnblogs.com/radiumlrb/p/6027898.html
NOIp 2014 #5 解方程 Label:数论?相关推荐
- 洛谷 题解 P2312 【解方程】
Problem P2312 [解方程] >>> record 用时: 1166ms 空间: 780KB(0.76MB) 代码长度: 2.95KB 提交记录: R9909587 > ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a0+ ...
- python用tkinter及sympy解方程
sympy是一个库,需自己下载 pip install sympy 导入库: from sympy import * import tkinter as tk from tkinter.message ...
- python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程
前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...
- java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...
用纯字符串格式来记录二次方程: '3x^2-10x-8=0' 'x^2-2x+1=0' '3x^2+14x+8=0' 'x^2=9' 二次方怎么表示呢?比如上面的^表示法,或者是python风格的** ...
- 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】
3751: [NOIP2014]解方程 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4856 Solved: 983 [Submit][Stat ...
- 10.24T3 解方程 取模意义下运算+秦九韶算法
#1228 解方程 描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入 输入共n + 2 行. 第一行包含2 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 重根迭代法解方程(两种方法)(Python实现)
简述 通过两种不同的重根迭代的来解方程. 处理的方程是 (sin(x) - x/2) ^2 = 0 代码 采用的第一种迭代重根迭代方法: xk+1=xk−mf(xk)f′(xk)xk+1=xk−mf( ...
- 【PC工具】如何简单粗暴无脑的解方程
都2020年了(二十一世纪快中叶了): 信息时代这么多年了,已经进入云计算时代了: 电脑都会下围棋了: 火箭都能回收了: ... 那么 问题就来了:我们是不是还要用手解方程呢?电脑能不能给爷(我)解方 ...
最新文章
- centos7 选定默认启动内核,及删除无用内核
- ODBC API 学习总结
- 直播预告丨聚焦银行数字化运营体系搭建,助力银行构建核心竞争力
- idea中提交mapper.xml到svn后代码变灰色
- eclipse无法添加Tomcat7
- WriteableBitmap process summary
- 字符串内置方法 第二弹
- Qcon大会上电子工业出版社博文视点提供全程技术图书支持
- 基于京东家电商品知识图谱的自动问答系统(三) -- Java实现问答系统
- java模式:深入单例模式
- 通信算法之三十五:GMSK/MSK/CPFSK/CPM/FSK仿真链路
- ELK之Kibana入门及使用
- (转)Django新手需要注意的10个要点
- 目标板(linux)与PC 网卡 直连(TFTP)
- 监控 - Prometheus监控
- 深圳金融展 聚焦明朝万达数据防泄密
- 学科实践活动感悟50字_学科实践活动写实记录50字范文
- Apache服务器配置默认首页文件名和网站路径
- 倍福--和第三方触摸屏连接失败分析
- 基于屌丝青年网样式二次开发的WordPress主题:LIiu-One主题