[BZOJ3751][NOIP2014] 解方程
Description
已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0
Input
Output
第一行输出方程在[1,m]内的整数解的个数。
Sample Input
2
-3
1
Sample Output
1
2
HINT
对于100%的数据,0<n≤100,|ai|≤1010000,an≠0,m≤1000000。
题解:
到现在还是不怎么清楚正解到底是什么,大多数人应该都是选择了取模吧。但是这个明显是一种很不稳定的做法,很难保证复杂度和正确性两者兼得,也许事后可以AC,但是考试的时候谁能有足够的信心保证自己写对了呢?
因为a数组的值极其之大,而m相对来说要小得多,所以可以考虑把结果取模,其实就像之前提到的字符串Hash一样,这是无法保证完美的正确性的,但是出现冲突的概率也是极小。这取决于你所取的模及其大小。
也许最开始可以想到的就是取一个9位数的大模,这样是可以得70分的,也是相对稳妥的一种方法,时间复杂度为O(m * len),len表示a[i]的位数。如何减小复杂度?通过平时数学知识的了解,我们知道,设当前所取的模为MOD,若x = i时满足条件,则x + MOD必定也是满足的,所以我们可以把复杂度降到O(MOD + m)。
这又有一个问题了,之前所取的模比len还要大一些的,那就不得不缩小MOD了。但是如果MOD过小的话,正确性更加无法保证。如同字符串Hash一样,我们也可以选择取多个模,当且仅当在所有模数情况下满足,这个数才满足。然而由于数不能过大,要找到真正合适的又能够不超时的(这里不说官方数据,官方数据比较水,但是BZOJ上的数据到现在我还是过不了),很难。
所以在知道正解之前,我觉得这就是一道RP题啊。
代码(官方数据100分,BZOJ超时,Hash值来自hzwer)
---------------------------------------------------------------------------------------------------
#include <cstdio>
#include <cstring>
#define MAXN 105
#define MAXM 1000005
#ifdef WIN32
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif
typedef long long ll;
const ll pri[5] = {11261, 19997, 22877, 21893, 14843};
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll n, m, a[5][MAXN], f[5][MAXM], l, ans[MAXM], x, tot;
char ch[MAXM];
ll calc(ll o, ll k)
{
ll x = 1, res = 0;
for (ll i = 0; i <= n; i++) (x *= o) %= pri[k], (res = x * a[k][i]) %= pri[k];
return res == 0;
}
int main()
{
freopen("3751.in", "r", stdin);
freopen("3751.out", "w", stdout);
scanf(LLD LLD, &n, &m);
for (ll i = 0; i <= n; i++)
{
scanf("%s", ch), l = strlen(ch), x = ch[0] == '-';
for (ll k = 0; k <= 4; k++)
for (ll j = x ? 1 : 0; j <= l - 1; j++)
(a[k][i] = (a[k][i] * 10) + ch[j] - '0') %= pri[k];
if (x) for (ll k = 0; k <= 4; k++) a[k][i] = pri[k] - a[k][i];
}
for (ll k = 0; k <= 4; k++)
for (ll i = 0; i < pri[k]; i++) f[k][i] = calc(i, k);
for (int i = 1; i <= m; i++)
{
int get = 1;
for (int k = 0; k <= 4; k++) if (!f[k][i % pri[k]]) { get = 0; break; }
if (get) ans[++tot] = i;
}
printf(LLD "\n", tot);
for (int i = 1; i <= tot; i++) printf(LLD "\n", ans[i]);
return 0;
}
---------------------------------------------------------------------------------------------------
[BZOJ3751][NOIP2014] 解方程的更多相关文章
- [BZOJ3751] [NOIP2014] 解方程 (数学)
Description 已知多项式方程:$a_0+a_1*x+a_2*x^2+...+a_n*x^n=0$ 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m ...
- BZOJ3751 NOIP2014 解方程(Hash)
题目链接 BZOJ3751 这道题的关键就是选取取模的质数. 我选了4个大概几万的质数,这样刚好不会T 然后统计答案的时候如果对于当前质数,产生了一个解. 那么对于那些对这个质数取模结果为这个数的数 ...
- [BZOJ3751][NOIP2014]解方程(数学相关+乱搞)
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
- 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程
在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...
- 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】
3751: [NOIP2014]解方程 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4856 Solved: 983[Submit][Status ...
- BZOJ 3751: [NOIP2014]解方程 数学
3751: [NOIP2014]解方程 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3751 Description 已知多项式方程: ...
- LOJ2503 NOIP2014 解方程 【HASH】
LOJ2503 NOIP2014 解方程 LINK 题目大意就是给你一个方程,让你求[1,m]中的解,其中系数非常大 看到是提高T3还是解方程就以为是神仙数学题 后来研究了一下高精之类的算法发现过不了 ...
- bzoj 3751: [NOIP2014]解方程 同余系枚举
3.解方程(equation.cpp/c/pas)[问题描述]已知多项式方程:a ! + a ! x + a ! x ! + ⋯ + a ! x ! = 0求这个方程在[1, m]内的整数解(n 和 ...
- bzoj3751 / P2312 解方程
P2312 解方程 bzoj3751(数据加强) 暴力的一题 数据范围:$\left | a_{i} \right |<=10^{10000}$.连高精都无法解决. 然鹅面对这种题,有一种常规套 ...
随机推荐
- ASP.NET运作流程
当我们在浏览器输入域名访问服务器资源时,会向服务器发送Http请求,并经由IIS处理后,交由ASP.NET托管程序处理,进入ASP.NET管道.在IIS内部如何处理我们不需要深入去了解,在ASP.NE ...
- svn post-commit 同步
@echo on SET REPOS=%1 SET USER=%2 SET SVN="D:\Program Files\VisualSVN Server\bin\svn.exe" ...
- bzoj 4695: 最假女选手
……一道丧病线段树膜板题…… 被常数卡的死去活来……QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多…… #include <bits/stdc++.h> #de ...
- Web干货存档
今天看了某乎,介绍了web一些基本东西,讲的很好,随手留下https://www.zhihu.com/question/22689579 web开发者文档,纯干货 https://develope ...
- 保存emoji到数据库
/// <summary> /// <summary> /// 字符串转Unicode /// </summary> /// <param name=&quo ...
- 使用wget命令时发生错误
用的是centos6.5, 当我使用命今 sudo wget https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz 下载个cmake的包时, 发生了这样的错误 ...
- Angular2 依赖注入
1. 使用DI 依赖注入是一个很重要的程序设计模式. Angular 有自己的依赖注入框架,离开了它,我们几乎没法构建 Angular 应用.它使用得非常广泛,以至于几乎每个人都会把它简称为 DI. ...
- root切换
1.su -i root.password 2.su passwd root pass pass su pass 3.su -val 一般用户名 4.
- Oracle 文件的导入与导出
说明:本机使用的是32位oracle,使用的方法是plsql导入与导出 1.导出数据步骤. 1)登陆上plsql后在工具里选择导出用户对象,选择上所有的表在选择保存的路径.点击导出就可以了. 2)上边 ...
- 配置VMware虚拟机用绕过校园网达到无线上网配置方法
因为平时要用到Vmware这样的工具上虚拟机上网, 但是本人是学生狗,学生狗在学校就要面对大学毒瘤软件--锐捷,而锐捷是不允许有虚拟网卡的存在的,所以上网只能用wifi上.之前试了很久,反正是怎么开都 ...