这尼玛也能过。。。
N^5了。。。。
/* ID: aznfy1 PROG: crypt1 LANG: C++ */ #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int num[9]; int main() { freopen("crypt1.in","r",stdin); freopen("crypt1.out","w",stdout); int n,a; while(cin>>n) { int sum=0; memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { cin>>a; num[a]=1; } for(int i1=1;i1<10;i1++) { if(num[i1]==0) continue; for(int i2=1;i2<10;i2++) { if(num[i2]==0) continue; for(int i3=1;i3<10;i3++) { if(num[i3]==0) continue; for(int i4=1;i4<10;i4++) { if(num[i4]==0) continue; for(int i5=1;i5<10;i5++) { if(num[i5]==0) continue; int ans1=(i1*100+i2*10+i3)*i5; int ans2=(i1*100+i2*10+i3)*i4; int ans3=ans2*10+ans1; if(num[ans1/100]&&num[ans1%100/10]&&num[ans1%10]&&num[ans2/100]&&num[ans2%100/10]&&num[ans2%10]&&ans1<=999&&ans2<=999&&num[ans3/1000]&&num[ans3%1000/100]&&num[ans3%100/10]&&num[ans3%10]&&ans3<=9999) sum++; } } } } } cout<<sum<<endl; } return 0; }
附上来自NOWCOW的非常NICE的哈希搜索法
#include <stdio.h> #include <string.h> int main() { freopen("crypt1.in","r",stdin); freopen("crypt1.out","w",stdout); long i,j,k,l,n,suma,sumb,sumc,num[15],tab,t1,t2; long a[1050],b[105]; char hash[10005]={0},h3[1005]={0}; scanf("%ld",&n); for(i=0;i<n;i++) scanf("%ld",&num[i]); for(i=0,suma=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++,suma++) a[suma]=num[i]*100+num[j]*10+num[k],h3[a[suma]]=1; //所有可能三位数 for(i=0,sumb=0;i<n;i++) for(j=0;j<n;j++,sumb++) b[sumb]=num[i]*10+num[j]; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) for(l=0;l<n;l++) hash[num[i]*1000+num[j]*100+num[k]*10+num[l]]=1; //所有可能四位数 for(i=0,sumc=0;i<suma;i++) for(j=0;j<sumb;j++) { tab=a[i]*b[j]; if(tab>=1000&&tab<=9999&&hash[tab]==1) //四位数并且能够由给出的数字构成 { t1=(b[j]%10)*a[i],t2=(b[j]/10)*a[i]; if(t1>=100&&t1<=999&&t2>=100&&t2<=999&&h3[t1]==1&&h3[t2]==1) //三位数并且能够由给出的数字构成 sumc++; } } printf("%ld\n",sumc); return 0; }