首页 > 代码库 > 方程的解数(codevs_1735)——hash
方程的解数(codevs_1735)——hash
这题挺简单的吧,其实只需要一步——就可以把暴力搜索的m^6降到m^3——那就是——请看代码
#include<iostream> #include<cstdio> #include<cstring> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; } const int mod=6750007; int n,m,k[8],p[8],mi[151][51],ans=0; struct hash{int val,num;}h[mod]; void getmi(){ for(int i=1;i<=150;i++){ mi[i][0]=1; for(int j=1;j<=50;j++) mi[i][j]=mi[i][j-1]*i; } } inline int abs(int x){return x>0?x:-x;} inline int f(int x){ int t=abs(x)%mod; while(h[t].num>0&&h[t].val!=x)t=(t+1)%mod; return t; } void dfs1(int t,int v){ if(t>n/2){int x=f(v);h[x].num++;h[x].val=v;return;} for(int i=1;i<=m;i++) dfs1(t+1,v+k[t]*mi[i][p[t]]); } void dfs2(int t,int v){ if(t>n){ans+=h[f(-v)].num;return;} for(int i=1;i<=m;i++) dfs2(t+1,v+k[t]*mi[i][p[t]]); } int main() { getmi();n=read();m=read(); for(int i=1;i<=n;i++)k[i]=read(),p[i]=read(); dfs1(1,0);dfs2(n/2+1,0);printf("%d\n",ans); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
方程的解数(codevs_1735)——hash
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。