- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 3751
- 在线时间
- 小时
|
楼主 |
发表于 2009-8-18 19:03:42
|
显示全部楼层
- #include <iostream>
- #include <cmath>
- #include <algorithm>
-
- using namespace std;
-
- const double MAXD=15.0;
- const int L=30000;
- __int64 prime[L];
- __int64 List[100];
- int length;
- int LLen=0;
-
- void Init(){
- prime[0]=2;
- prime[1]=3;
- prime[2]=7;
- length=3;
- for( int i=10; i<L; ++i ){
- int s=int(sqrt(i));
- bool flag=true;
- for( int j=2; j<=s && flag; ++j )
- if( i%j==0 ) flag=false;
- if( flag ){
- int temp=i-1;
- for( int k=0; k<length; ++k ){
- while( temp%prime[k]==0 ){
- temp/=prime[k];
- }
- }
- if( temp==1 ){
- prime[length++]=i;
- }
- }
- }
- }
-
- int element[5];
- double log_p[5];
- int expon[5];
- int count1=0;
-
- void fun(double sum, int level, int maxlen, double MAXD){
- if( level==maxlen+1 ){
- __int64 number=1, phi=1;
- for( int j=0; j<=maxlen; ++j ){
- __int64 temp=element[j];
- for( int k=0; k<expon[j]; ++k )
- number*=temp;
- for( k=0; k<expon[j]-1; ++k )
- phi*=temp;
- phi*=temp-1;
- }
- __int64 t=number;
- int dig[100], index=0;
- bool flag=true;
- while( t && flag ){
- dig[index]=t%10;
- t/=10;
- if( dig[index]==0 || number%dig[index]!=0 )
- flag=false;
- else
- index++;
- }
- if( flag ){
- int i;
- int road[4]={0,0,0,0};
- int less_than10[4]={2,3,5,7};
- for( i=0; i<sizeof(road)/sizeof(road[0]); ++i ){
- for( int j=0; j<=maxlen; ++j ){
- if( element[j]==less_than10[i] )
- road[i]=expon[j];
- }
- }
-
- __int64 Tot=0;
- for( int k=0; k<index; ++k ){
- switch( dig[k] ){
- case 1 :
- Tot+=phi;
- break;
- case 2 :
- if( road[0]>1 )
- Tot+=phi/2;
- else
- Tot+=phi;
- break;
- case 3 :
- if( road[1]>1 )
- Tot+=phi/3;
- else
- Tot+=phi/2;
- break;
- case 4 :
- if( road[0]>2 )
- Tot+=phi/4;
- else
- Tot+=phi/2;
- break;
- case 5 :
- if( road[2]>1 )
- Tot+=phi/5;
- else
- Tot+=phi/4;
- break;
- case 6 :
- if( road[0]>1 ){
- if( road[1]>1 )
- Tot+=phi/6;
- else//2^k*3^1
- Tot+=phi/4;
- }
- else{
- if( road[1]>1 )
- Tot+=phi/3;
- else//2^1*3^1
- Tot+=phi/2;
- }
- break;
- case 7 :
- if( road[3]>1 )
- Tot+=phi/7;
- else
- Tot+=phi/6;
- break;
- case 8 :
- if( road[0]>3 )
- Tot+=phi/8;
- else
- Tot+=phi/4;
- break;
- case 9 :
- if( road[1]>2 )
- Tot+=phi/9;
- else
- Tot+=phi/6;
- break;
- }
- }
-
- if( Tot==number ){
- printf("%I64d\n",number);
- List[LLen++]=number;
- }
- }
- return;
- }
- for( int i=1; sum+i*log_p[level]<MAXD; ++i ){
- expon[level]=i;
- fun( sum+i*log_p[level], level+1, maxlen, MAXD );
- expon[level]=0;
- }
- }
-
-
- void calc(int *list, int len){
- int i;
- for( i=0; i<=len; ++i )
- log_p[i]=log10(element[i]);
- fun( 0, 0, len, MAXD );
- }
-
- void dfs( int index, int level ){
- int i;
- if( level==5 ){
- calc( element, level-1 );
- return;
- }
- for( i=index; i<length; ++i ){
- __int64 temp=prime[i]-1;
- for( int k=0; k<level; ++k ){
- while( temp%element[k]==0 ) temp/=element[k];
- }
- if( temp==1 ){
- element[level]=prime[i];
- dfs( index+1, level+1 );
- calc( element, level );
- element[level]=0;
- }
- }
- }
-
- void start(){
- int head[]={2,3,5,7};
- for( int i=0; i<sizeof(head)/sizeof(head[0]); ++i ){
- element[0]=head[i];
- dfs( i+1, 1 );
- }
- }
-
- int main(){
- Init();
- start();
- cout<<"========================================\n";
- sort( List, List+LLen );
- __int64 *end=unique( List, List+LLen );
- for( int i=0; List+i!=end; ++i )
- printf("%I64d\n",List[i]);
- return 0;
- }
复制代码 |
|