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
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; ll v[],a[],ans,N,M,p; ll pow(ll x,ll n){
ll ans=;
while(n){
if(n&) ans=ans*x;
x=x*x;
n>>=;
}
return ans;
} ll cc(ll x){
ll ans=a[];
for(ll i=;i<=N;i++){
ans+=a[i]*pow(x,i);
}
if(ans==) {
v[++p]=x;
return ;
}
return ;
} int main(){
// freopen("equation.in","r",stdin);
// freopen("equation.out","w",stdout); scanf("%lld%lld",&N,&M);
for(ll i=;i<=N;i++){
scanf("%lld",&a[i]);
} for(ll i=;i<=M;i++){
if(cc(i)) ++ans;
} printf("%lld\n",ans);
for(ll i=;i<=p;i++) printf("%lld\n",v[i]); return ;
}不会写,水过了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左右就完全没有问题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define PROB "equation"
#define MAXN 1100001
ifdef WIN32 #define LL "%I64d"
#else
#define LL "%lld"
#endif
typedef long long qword;
const int mod[] =
{,,,,
};
int a[][];
bool ok[MAXN];
bool ok2[][];
char s[];
int n,m;
void work();
int main()
{
int ii,i,j, k;
int x;
scanf("%d%d\n",&n,&m);
int ll = ;
for (ii=;ii<=n;ii++)
{
// scanf("%s", s);
fgets(s,sizeof(s),stdin);
int l = strlen(s)-;
if((s[l-]<'' || s[l-]>'') && s[l-]!='-')l--;
for(int j = ; j < ll; j ++){
int pmod = mod[j];
a[j][ii] =;
x=;
k=;
if (s[k]=='-')k++,x=-x;
else if (s[k]=='+')k++;
for (;k<l;k++)
{
a[j][ii]=(a[j][ii]*+s[k]-'')%pmod;
}
a[j][ii]=a[j][ii]*x%pmod;
if(a[j][ii] < )
a[j][ii] += pmod;
}
}
memset(ok,,sizeof(ok));
memset(ok2,,sizeof(ok2));
int pmod;
int ans;
for (ii=;ii<ll;ii++)
{
pmod=mod[ii];
for (i=;i<pmod;i++)
{
ans=;
for (j=n;j>=;j--)
{
ans=(ans * i + a[ii][j])%pmod;
}
if (ans)
{
ok2[ii][i]=false;
}
}
}
int cnt = ;
for (int i=;i<=m && cnt <= n;i++)
{
for (int j=;j<ll;j++)
{
if (!ok2[j][i%mod[j]]){
ok[i]=false;
break;
}
}
if(ok[i])
++ cnt;
}
printf("%d\n",cnt);
for (i=;i<=m;i++)
if (ok[i])
printf("%d\n",i);
return ;
}
NOIp 2014 #5 解方程 Label:数论?的更多相关文章
- NOIP 2014 D2T3 解方程 Hash大法好
题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根 ai<=10^10000.m<=100W 懒得高精,考场上写的long dou ...
- 【UOJ #20】【NOIP 2014】解方程
http://uoj.ac/problem/20 并不会做...然后看题解....... 对a取模,避免了高精度带来的复杂度,然后再枚举x判断是否满足模意义下等于0. 取5个模数,我直接抄的别人的_( ...
- 洛谷P2312 解方程 [noip2014] 数论
正解:数论 解题报告: 这儿是,传送门qwq 又是很妙的一道题呢,专门用来对付我这种思维僵化了的傻逼的QAQ 首先看题目的数据范围,发现a<=1010000,很大的一个数据范围了呢,那这题肯定不 ...
- 2018.11.02 洛谷P2312 解方程(数论)
传送门 直接做肯定会TLETLETLE. 于是考验乱搞能力的时候到了. 我们随便选几个质数来checkcheckcheck合法解,如果一个数无论怎么checkcheckcheck都是合法的那么就有很大 ...
- NOIp 2014 #3 寻找道路 Label:图论
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- luogu2312 解方程 (数论,hash)
luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...
- vijos P1915 解方程 加强版
背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...
- [NOIP2014]解方程
3732 解方程 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 输入描述 Input Descrip ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...
随机推荐
- cache buffers
buffers缓冲,可以型象的理解为漏斗.如果有大量的数据要写入磁盘,由于数据量很大,磁盘不能一下子接收,所以这个时候,就有了buffer这个漏斗,先把数据放入这个漏斗里面,然后让它慢慢的注入磁盘,这 ...
- find 查找文件 -exec 然后压缩 查看tar包的内容
[root@cs Downloads]# find ./ -name "banner*" -exec tar -cvf k.tar "{}" \; ./bann ...
- SQL exists( select 1 from
use UnlockIndustry select * from Info_Coordinate as A join Info_Employee on A.EmployeeId=Info_Employ ...
- PHP中array_merge和array相加的区别分析
今天处理一个这样的问题:如何获取字符键名相同值不同的两个数组值集合,用array_merge和数组相加都不可行,让我认真比较了下PHP中array_merge和array相加的区别 首先来看看键名是s ...
- Delphi面向对象的可见性表示符
Delphi能通过在声明域和方法的时候用protected.private.public.published和automated指示符来对对象提供进一步的控制.使用这些关键字的语法如下 TSomeOb ...
- Delphi中的各种字符串、String、PChar、Char数组
参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...
- C#DataGridView合计处理
网上查了一些关于合计的代码 ,但发现大都都不尽人意,就自己再根据资料改了一下. #region 合计 //调用方法示例 //HeJi heji = null; //heji = new HeJi(la ...
- wp8 入门到精通 数据库更新字段(一)
public class UserInfoDB : BaseDB { public UserInfoDB() : base(@"Data Source=isostore:\MakeLove\ ...
- PHP实现上一篇、下一篇
//php实现上一篇.下一篇 获取当前浏览文章id $id = isset($_GET[ ? intval($_GET['id']) : ""; 下一篇文章 $query = my ...
- 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数
题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...