【NOIP2014提高组】解方程
https://www.luogu.org/problem/show?pid=2312
对于30%的数据,n<=2,暴力带入试解。
对于50%的数据,ai很大,结合高精乘法和霍纳算法暴力代入试解。
高精乘法,时间复杂度是很恐怖的而且我不懂写。
注意到虽然ai很大,但是m还是在int范围内的。
继续考虑暴力试解。
考虑到0 mod k=0 (k∈N*),那么当f(x)=0时,f(x) mod k=0。
但是反过来f(x) mod k=0不一定使f(x)=0成立。当k|f(x)时,f(x) mod k=0也能成立。
为了尽可能避免这种情况,和hash一样,k取几个素数,只有膜这几个素数的时候f(x) mod k=0均成立,才判断f(x)=0成立。
在本题中,故
发现ai可以被膜掉,成功回避高精运算。
实际实现的时候可以写一个和快速读入一样的东西,一边读一边膜。也可以先以字符串的形式读进来,再计算成膜k的值。
然后发现xi也被膜掉,也就是说f(x) mod k=f(x+k) mod k。因此试解的时候只需要试[1,k)范围内的解。当然,k要取远比m小的数,这个优化才有意义。
模几个素数呢?模多大的素数呢?这是个非常看脸的问题。少了会WA,多了会TLE。
经过多次测试,模5个10000左右的素数是坠吼的。可是NOIP哪有机会多次测试
#include <algorithm>
#include <iostream>
#include <vector>
#include <cctype>
#include <cstring>
#define maxn 105
#define maxm 1000005
#define NUM_OF_PRIME 5
typedef long long llint;
using namespace std;
const llint prime[NUM_OF_PRIME] = {9859ll, 9631ll, 9059ll, 8783ll, 8291ll};
llint a[maxn][NUM_OF_PRIME]; //a[i][j] => i次项系数 % prime[j]
int n, m;
void geta(int i)
{
char c;
bool flag = false;
while (!isdigit(c = getchar()))
{
if (c == '-')
flag = true;
}
do
{
for (int k = ; k < NUM_OF_PRIME; k++)
a[i][k] = (a[i][k] * % prime[k] + c - '') % prime[k];
} while (isdigit(c = getchar()));
if (flag)
{
for (int k = ; k < NUM_OF_PRIME; k++)
a[i][k] = -a[i][k];
}
}
llint get_val(llint x, int k) // return f(x) mod k
{
llint val = ;
for (int i = n; i >= ; i--)
val = (val * x % prime[k] + a[i][k]) % prime[k];
return val;
}
bool isroot[maxm];
int main()
{
cin >> n >> m;
for (int i = ; i <= n; i++)
geta(i);
memset(isroot, true, m + );
for (int k = ; k < NUM_OF_PRIME; k++)
{
for (int i = ; i < min(prime[k], (llint)m + ); i++)
{
bool equalzero = get_val(i, k) == ;
for (int j = i; j <= m; j += prime[k])
isroot[j] &= equalzero;
}
}
vector<int> ans;
for (int i = ; i <= m; i++)
if (isroot[i])
ans.push_back(i);
cout << ans.size() << endl;
for (int i = ; i < ans.size(); i++)
cout << ans[i] << endl;
return ;
}
【NOIP2014提高组】解方程的更多相关文章
- [NOIp2014提高组]解方程
思路: 系数的范围有$10^{10000}$,但是用高精度做显然不现实,因此可以考虑一个类似于“哈希”的做法, 对方程两边同时取模,如果取的模数足够多,正确率就很高了. 中间对多项式的计算可以使用$O ...
- NOIP2014提高组解方程
其实没有太难 但是不知道的话想不到 考场上大概有50分吧 #include <iostream> #include <stdio.h> #include <queue&g ...
- [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- 刷题总结——飞扬的小鸟(NOIP2014提高组)
题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...
- 垃圾陷阱 && [NOIP2014 提高组] 飞扬的小鸟
#include<bits/stdc++.h> using namespace std; int d,n,dp[1010]; struct node{int t,f,h;} a[1010] ...
- NOIP2014提高组 酱油记
NOIP考到哪里我就写到哪里好了. 2014/10/12 初赛 下午两点半开始考,我两点就到了.然后看到了QYL,NYZ,CZR等大神,先Orz了再说. 考试开始前,发现考场竟然没几个我认识的,不是按 ...
- noip2014 提高组
T1 生活大爆炸版 石头剪刀布 题目传送门 就是道模拟题咯 #include<algorithm> #include<cstdio> #include<cstring&g ...
- NOIP2014提高组 题解报告
D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...
- 【学术篇】luogu1351 [NOIP2014提高组] 联合权值
一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一 ...
- [NOIP2014] 提高组 洛谷P2312 解方程
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
随机推荐
- 如何用Android Studio同时使用SVN和Git管理项目
这篇来讲讲如何在 Android Studio 上同时用 SVN 和 Git 来管理项目.我知道,你肯定会说我吃饱了撑着,没事找事做,为啥要同时用 SVN 和 Git 来管理项目.问题是,我也不想啊, ...
- Sudoku Killer
Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...
- canvas图形编辑器
原文地址:http://jeffzhong.space/2017/11/02/drawboard/ 使用canvas进行开发项目,我们离不开各种线段,曲线,图形,但每次都必须用代码一步一步的实现.有没 ...
- Flex布局语法
flexbox 弹性盒布局和布局原理 新版的flexbox规范分两部分:一部分是container,一部分是 items. flexbox是一整套布局规范,包含了多个css属性,所以学习起来比`flo ...
- scrollWidth,clientWidth,offsetWiddth,innerWinth 元素定位
getBoundingClientRect()方法.它返回一个对象,其中包含了left.right.top.bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左 ...
- idea java项目部署至Tomcat服务器
1. 服务器部署TomCat 1. 安装JDK,配置环境变量 > 变量名:JAVA_HOME;变量值:C:\Program Files\Java\jdk1.7.0_45 ...
- java中volatile的简单理解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
- linux操作系统基础篇(五)
Linux网络以及rpm安装yum源的配置 1.Linux网络 1. 使用ifconfig命令来维护网络1) fconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址.2) ...
- MarkdownPad2代码高亮插件兼容移动端样式
如果不知道MarkdownPad2使用代码高亮插件可以查看前一篇文章<MarkdownPad2使用代码高亮插件> 先看移动端效果图: 移动端点击查看效果 或者手机扫如下二维码: 我们经常阅 ...