码迷,mamicode.com
首页 > 其他好文 > 详细

方程的解数(codevs_1735)——hash

时间:2017-08-09 22:24:06      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:getch   ora   style   ++   blog   read   amp   using   简单的   

这题挺简单的吧,其实只需要一步——就可以把暴力搜索的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

标签:getch   ora   style   ++   blog   read   amp   using   简单的   

原文地址:http://www.cnblogs.com/Yzyet/p/7327826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!