[BZOJ3751][NOIP2014]解方程(数学相关+乱搞)
2016-11-13 19:28
537 查看
题目描述
传送门题解
显然若f(n)≡0(modp),则f(n+p)≡0(modp)。所以我们可以选上几个质数,然后check出0-p-1之内的答案,然后由这些答案推出1-m内的答案。选上5个质数就差不多了。(抄的hzwer的质数
不过这样的话跑得奇慢无比。算算时间复杂度应该是有一坨常数。
但是TA学长有一个我觉得更厉害并且可以证明时间复杂度的做法:首先选一个小质数p,然后处理出来0-p-1内的答案,然后推出1-m内的答案。然后再选一个大质数P,用来check所有合法的答案。
由拉格朗日定理,在0-p-1内至多只有n个解,这样的话不合法的答案至多会被check n 个。那么时间复杂度可以估算为O(np+n2mp)=O(n(p+nmp))其实是个对勾函数,当p=nm−−−√时有最小值,即O(2nnm−−−√)≈2∗106.
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define N 1000005 int n,m,ans,aa[105],mi[105]; char a[105][10005]; bool wtf ,is[100005]; int Mod[5]={11261,19997,22877,21893,14843}; int calc(int id,int mod) { int len=strlen(a[id]),A=0,st=0; bool flag=false; if (a[id][0]=='-') flag=true,st=1; for (int i=st;i<len;++i) A=(A*10+a[id][i]-'0')%mod; return (!flag)?A:-A; } int main() { scanf("%d%d\n",&n,&m); for (int i=0;i<=n;++i) scanf("%s",a[i]); for (int i=1;i<=m;++i) wtf[i]=1; for (int k=0;k<5;++k) { for (int x=0;x<Mod[k];++x) is[x]=1; for (int i=0;i<=n;++i) aa[i]=calc(i,Mod[k]); for (int x=0;x<Mod[k];++x) { mi[0]=1;for(int i=1;i<=n;++i) mi[i]=mi[i-1]*x%Mod[k]; ans=0; for (int i=0;i<=n;++i) ans=(ans+aa[i]*mi[i]%Mod[k])%Mod[k]; if (ans) is[x]=0; } for (int x=1;x<=m;++x) if (!is[x%Mod[k]]) wtf[x]=0; } ans=0; for (int i=1;i<=m;++i) if (wtf[i]) ans++; printf("%d\n",ans); for (int i=1;i<=m;++i) if (wtf[i]) printf("%d\n",i); }
总结
①遇到这种题各种奇技淫巧还是要想一想的。相关文章推荐
- [BZOJ3751][NOIP2014][数学][乱搞]解方程
- [BZOJ3751][NOIP2014]解方程(乱搞)
- 【乱搞】BZOJ3751(UOJ#20)[NOIP2014]解方程
- NOIP2014 bzoj3751 Day2T3 解方程 数学&hash
- bzoj 3751: [NOIP2014]解方程(同余系)
- bzoj 3751: [NOIP2014]解方程【数学】
- [BZOJbegin][NOIP十连测第五场]Travel(数学相关+乱搞)
- BZOJ 3751: [NOIP2014]解方程 数学
- 【hash】BZOJ3751-[NOIP2014]解方程
- [BZOJbegin][NOIP十连测第五场]Walk(数学相关+树形dp)
- 【bzoj3751】[NOIP2014]解方程 数论
- 【BZOJ】3751: [NOIP2014]解方程
- [BZOJbegin][NOIP十连测第九场]小P的生成树(数学相关+kruskal)
- NOIP2014 D2T3 解方程 BZOJ3751 UOJ20 数论 秦九韶算法 玄学
- 【数论】[NOIP2014]bzoj3751 codevs3732 解方程
- [BZOJbegin][NOIP十连测第五场]Simpe(递推+数学相关)
- bzoj 3751: [NOIP2014]解方程 同余系枚举
- 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程
- BZOJ 3751 [NOIP2014]解方程 百年老坑填坑计划QAQ--Hash
- bzoj 3751: [NOIP2014]解方程