[模拟+打表]hdoj 4235:Vampire Numbers
大致题意:
? ? 如果一个数字n能分解为两个数字的乘积,且这两个数字的各位数字的个数之和与n的各位数字的个数相同,则称n为Vampire Numbers。现在输入一个数,求大于等于这个数的最小的Vampire Numbers。
?
大致思路:
? ? 比赛时乍看上去一点思路都没有,后来想了想,写个程序,把所有的Vampire Numbers打了出来,然后水过去了
打表程序(不是ac代码!):
#include<iostream>#include<cstring>#include<cmath>#include<cstdio>using namespace std;int vis[20];int num[20];bool isval(){ for(int i=0;i<10;i++){ if(vis[i]!=num[i]){ return 0; } } return 1;}bool getnum(long long n){ long long a=n; long long b,c; memset(vis,0,sizeof(vis)); while(a){ vis[a%10]++; a/=10; } for(long long i=2;i<sqrt(n);i++){ if(n%i==0){ memset(num,0,sizeof(num)); b=i,c=n/i; while(b){ num[b%10]++; b/=10; } while(c){ num[c%10]++; c/=10; }// if(i==6){// for(i=0;i<10;i++){// cout<<num[i]<<" ";// }cout<<endl;// } if(isval()){ return 1; } } } return 0;}int main(){ long long i,j,n,k=0; freopen("gift.out","w",stdout);// cout<<getnum(126)<<endl; for(i=11;i<=1000000;i++){// printf("%d\n",i); if(getnum(i)){ printf(",%d",i); k++; } }cout<<"\nfuck"<<k<<endl; return 0;}
?
具体ac的代码就不贴了,就是把上面代码输出的结果复制粘贴一下。