洛谷P2312:解方程 (Hash+数学)
2017-10-18 16:37
295 查看
题目传送门:https://www.luogu.org/problem/show?pid=2312
题目分析:一道脑洞很大的题……这要是在考场上我绝对暴力高精度水50走人。
要判断一个很算式的结果是不是0,而且算式中的数字都很大,我们可以将算式中的数字模几个大质数,看算出来的结果是否都为0。于是这题我们将每个系数模几个大质数,再暴力将[1,m]中的数代入检验,就有70分了。
至于100分……要用到一个很简单的结论:f(x)%p=f(x%p)%p,也就是说只要枚举[0,p-1]就行了。将质数p的大小控制在104左右,就能AC。
CODE:
题目分析:一道脑洞很大的题……这要是在考场上我绝对暴力高精度水50走人。
要判断一个很算式的结果是不是0,而且算式中的数字都很大,我们可以将算式中的数字模几个大质数,看算出来的结果是否都为0。于是这题我们将每个系数模几个大质数,再暴力将[1,m]中的数代入检验,就有70分了。
至于100分……要用到一个很简单的结论:f(x)%p=f(x%p)%p,也就是说只要枚举[0,p-1]就行了。将质数p的大小控制在104左右,就能AC。
CODE:
#include<iostream> #include<string> #include<cstring> #include<cmath> #include<cstdio> #include<cstdlib> #include<stdio.h> #include<algorithm> using namespace std; const int maxn=105; const int maxm=10010; const int M[6]={9929,9931,9941,9949,9967,9973}; int a[6][maxn]; bool vis[6][maxm]; char s[maxm]; int n,m; bool Judge(int x) { for (int j=0; j<6; j++) if (vis[j][x%M[j]]) return false; return true; } int main() { freopen("2312.in","r",stdin); freopen("2312.out","w",stdout); scanf("%d%d",&n,&m); for (int i=0; i<=n; i++) { scanf("%s",&s); int len=strlen(s); int h=0; if (s[h]=='-') h++; for (int j=0; j<6; j++) { int v=0; for (int k=h; k<len; k++) v=(v*10+(s[k]-'0'))%M[j]; if (!h) a[j][i]=v; else a[j][i]=(M[j]-v)%M[j]; } } for (int j=0; j<6; j++) for (int i=0; i<M[j]; i++) { int sum=0,v=1; for (int k=0; k<=n; k++) sum=(sum+v*a[j][k])%M[j],v=v*i%M[j]; if (sum) vis[j][i]=true; } int num=0; for (int i=1; i<=m; i++) if ( Judge(i) ) num++; printf("%d\n",num); for (int i=1; i<=m; i++) if ( Judge(i) ) printf("%d\n",i); return 0; }
相关文章推荐
- 数学——洛谷 P2312 解方程
- 洛谷 P2312 解方程
- 洛谷 P2312 [NOIP2014 D2T3] 解方程
- 洛谷 P2312 解方程
- NOIP2014 bzoj3751 Day2T3 解方程 数学&hash
- 洛谷 P2312 解方程
- 洛谷 P2312 解方程
- 洛谷 P2312 解方程
- NOIP 2014 D2T3 解方程 Hash大法好
- 洛谷 数学问题专题 三国游戏
- P2312 解方程
- 洛谷 P3708 koishi的数学题
- "简单"的数学问题 洛谷 P1414 又是毕业季II
- hdu 2529 shot 数学问题 解方程
- poj Intersection 1410 (数学几何 求线段方程)
- 洛谷 P2788 数学1(math1)- 加减算式
- 不定式方程求整数解(爱因斯坦的数学题)
- 动态规划与数学方程法解决楼层扔鸡蛋问题
- poj 1186 poj 1840 方程的解数 hash+枚举 (n/2)
- 【数学】直线方程