P5691 [NOI2001]方程的解数 题解
#include<bits/stdc++.h>
using namespace std;
int t1[3500005],t2[3500005],k[10],p[10],n,m,mid,last,s1,s2,cnt1,cnt2,ans;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return s*w;
}
inline int ksm(int x,int y){
int s=1;
while(y){
if(y&1)
s*=x;
x*=x;
y>>=1;
}
return s;
}
inline void dfs(int now,int cnt,int *t,int &sum){
if(last<now){
t[++sum]=cnt;
return ;
}
for(int i=1;i<=m;++i)
dfs(now+1,cnt+k[now]*ksm(i,p[now]),t,sum);
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)
k[i]=read(),p[i]=read();
last=mid=n/2;
dfs(1,0,t1,s1);
last=n;
dfs(mid+1,0,t2,s2);
int x=s2;
sort(t1+1,t1+s1+1);
sort(t2+1,t2+s2+1);
for(int i=1;i<=s1;++i){
while(x&&t1[i]+t2[x]>0)
--x;
if(!x)
break;
if(!(t1[i]+t2[x])){
cnt1=cnt2=1;
while(i<s1&&t1[i]==t1[i+1])
++cnt1,++i;
while(x>1&&t2[x]==t2[x-1])
++cnt2,--x;
ans+=cnt1*cnt2;
}
}
printf("%d",ans);
return 0;
}
评测记录
时间rk2