vijos P1915 解方程 加强版
背景
B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜.....
为了安慰可怜的B酱, vijos刻意挂出来了真实的题目!
描述
已知多项式方程:
$$a_0+a_1x+a_2x^2+...+a_nx^n=0$$
求这个方程在[1, m]内的整数解(n 和 m 均为正整数)。
输入格式
输入共 n+2 行。
第一行包含 2 个整数 n、m,每两个整数之间用一个空格隔开。
接下来的 n+1 行每行包含一个整数,依次为$a_0,a_1,a_2,...a_n$。
输出格式
第一行输出方程在[1, m]内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m]内的一个整数解。
限制
对于20%的数据,$0<n\leq 100$,$|a_i|<=10^{100}$,$a_n \neq 0$,$m\leq 100$;
对于40%的数据,$0<n\leq 100$,$|a_i|<=10^{10000}$,$a_n \neq 0$,$m\leq 10000$;
对于70%的数据,$0<n\leq 100$,$|a_i|<=10^{10000}$,$a_n \neq 0$,$m\leq 1000000=10^6$;
对于100%的数据,$0<n\leq 100$,$|a_i|<=10^{10000}$,$a_n \neq 0$,$m\leq 100000000=10^8$。
[实际上来说就算m <= 10^10也是可以做的, 不过我把时间限制设定为0.5秒,感觉也差不多了。THU某人: O(m)的算法过不去了, 呜呜呜....]
刚把$noip$的欠账:解方程给补上,又发现了vijos上还有一道加强版。这道题主要就是把$m$的范围加强到了$10^8$,卡掉了$O(m)$的算法。题解戳这里
不过这道题我把解方程$O(m)$的算法稍微优化了一下,然后就这么过去了……
原题$O(m)$的算法主要就是自己设一个模数$p$,先把区间$[0,p)$中的解给算出来,然后方程在$x$处的取值就是方程在$x \bmod p$处的取值,于是可以在$O(pn)$的处理后,用$O(m)$的复杂度得到方程在$[1,m]$中的取值。然而这样其实是有非常多的冗余状态的,因为真正对我们有用的位置只是值为$0$的位置。于是我们可以只处理这些位置,分别存到数组中,最后判断一下某个值是否在每个模数下都出现即可。加了这一点优化后即可获得$AC$。
还有我的这份代码在BZOJ上A不了,需要换一组模数……果然我还是血统不行……
下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define N 110
#define maxn 10010
#define maxm 1000010
#define zushu 4 using namespace std;
typedef long long llg; int p[zushu]={7757,11959,15121,20011},nn[N];
int n,m,l[N],mod,st[N],d[zushu][maxm],ld[zushu];
int ans[maxm],la,ci[maxm],nw[zushu];
char s[N][maxn];
bool fu[maxn<<1]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} int suan(int x){
int ans=0,now=1;
for(int i=0;i<=n;i++){
ans+=nn[i]*now%mod,ans%=mod;
now*=x,now%=mod;
}
return ans;
} void work(){
for(int i=1;i<zushu;i++) nw[i]=1;
for(nw[0]=1;nw[0]<=ld[0];nw[0]++){
bool ww=1;
if(d[0][nw[0]]>m) break;
for(int i=1;i<zushu;i++){
while(d[i][nw[i]]<d[0][nw[0]]) nw[i]++;
if(d[i][nw[i]]!=d[0][nw[0]]) ww=0;
if(nw[i]>ld[i]) return;
}
if(ww) ans[++la]=d[0][nw[0]];
}
} int main(){
File("a");
n=getint(); m=getint();
for(int i=0;i<=n;i++){
scanf("%s",s[i]+1),l[i]=strlen(s[i]+1);
st[i]=(s[i][1]=='-'?2:1); fu[i]=(s[i][1]=='-');
}
for(int i=0;i<zushu;i++){
mod=p[i];
for(int j=0;j<=n;j++){
nn[j]=0;
for(int k=st[j];k<=l[j];k++) nn[j]=nn[j]*10+s[j][k]-'0',nn[j]%=mod;
if(fu[j]) nn[j]=-nn[j];
}
for(int j=0;j<mod;j++) if(!suan(j)) d[i][++ld[i]]=j;
for(int j=1;j<=ld[i];j++)
if(d[i][j]+mod<=m) d[i][++ld[i]]=d[i][j]+mod;
else break;
}
work();
printf("%d\n",la);
for(int i=1;i<=la;i++) printf("%d\n",ans[i]);
return 0;
}
后天就是$noip$了,我现在还感觉有各种板子没有复习……感觉药丸……
还有我在想我要不要也开一篇游记什么的……等我复习完了模板再说吧……也许我复习不完了。
vijos P1915 解方程 加强版的更多相关文章
- [NOIP2014] 解方程&加强版 (bzoj3751 & vijos1915)
大概有$O(m)$,$O(n\sqrt{nm})$,$O(n\sqrt{m})$的3个算法,其中后2个可以过加强版.代码是算法3,注意bzoj的数据卡掉了小于20000的质数. #include< ...
- HDU 4793 Collision --解方程
题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,v ...
- codevs3732==洛谷 解方程P2312 解方程
P2312 解方程 195通过 1.6K提交 题目提供者该用户不存在 标签数论(数学相关)高精2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 已知多项式方程: a ...
- [NOIP2014]解方程
3732 解方程 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 输入描述 Input Descrip ...
- bzoj 3751: [NOIP2014]解方程 同余系枚举
3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...
- Ural 1046 Geometrical Dreams(解方程+计算几何)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1046 参考博客:http://hi.baidu.com/cloudygoose/item ...
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
- 5.5Python数据处理篇之Sympy系列(五)---解方程
目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...
- python 解方程
[怪毛匠子=整理] SymPy 库 安装 sudo pip install sympy x = Symbol('x') 解方程 solve([2 * x - y - 3, 3 * x + y - 7] ...
随机推荐
- sql执行循序
(8) select (9) distinct (11) top 1 (6) Table1.id,COUNT(Table1.name) as nameCount (1) from Table1 (3) ...
- GJM :异步Socket [转载]
原帖地址:http://blog.csdn.net/awinye/article/details/537264 原文作者:Awinye 目录(?)[-] 转载请原作者联系 Overview of So ...
- 《C#微信开发系列(4)-接收 / 返回文本消息》
4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...
- Three.js 入门指南(核心对象)
推荐大家可以看看这个:http://wenku.baidu.com/link?url=RQU2exzV_EF3GATc3bzQU2o9LGMuCmiN5nUJth5SLG3E2TrxtBLQodJU_ ...
- 动画在webapp中的现状
webapp的一大优势便是在view切换时候可以拥有媲美与native的动画效果,但是很多时候那只是一种想法,真正的情况却不是这样 产生此问题的原因有: ① 手机CPU烂! ② 手机显卡烂!就算四核其 ...
- Json to JObject转换的使用方法
Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...
- SharePoint 2013 入门教程之创建及修改母版页
在SharePoint 2013中,微软提供了根据HTML页面转换Master页的方法,并支持单项同步,但是这样的更新,并不完善,会使一些功能造成丢失,所以,了解Master结构的人,尽量直接去修改M ...
- SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性
SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客户端.产品基于统一的架构体系,面向Web端和移动端提供了多种类型的SDK开发包,帮助 ...
- iOS多线程之5.GCD的基本使用
上一篇文章我对GCD的几个基本概念做了介绍,但是大家看完了可能觉得对理解GCD并没有什么卵用.其实会用GCD其实很简单,只要记住两条就可以了. 1. 主队列里的任务必须在异步函数中执行. 主队 ...
- Android编码规范02
同一项目开发过程中需要所有开发人员都有一种风格,做Android项目就要统一遵从Android代码风格: 要想了解Android的代码风格,最好的方式就是查看Android源代码: 下载Android ...