找回密码
 欢迎注册
楼主: medie2005

[讨论] Puzzle 500. 211896

[复制链接]
 楼主| 发表于 2009-8-11 13:28:35 | 显示全部楼层
本帖最后由 medie2005 于 2009-8-11 13:32 编辑 分析一下: 计算$phi(n/k)$ [1<=k<=9]. 必定有:$phi(n/k)=phi(n)*1/t$. [其中,1<=t<=9, t由k以及n的素分解决定]. 因此,如果n是一个解,那么,必要条件是: $n=phi(n)*u/v$. [其中,$u/v$是$1/1,1/2,1/3,...,1/9$中选若干个的和] 而根据u的大小,我们可以断定n的最大素因子的范围.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-8-16 16:43:18 | 显示全部楼层
继续分析一下: 由上面的分析,v<5*7*8*9.考虑等式两边2的次数,我们可以得出: 若n为偶数,则n至多含4个奇素因子; 若n为奇数,则n至多含3个奇素因子;
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-8-18 19:03:42 | 显示全部楼层
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. const double MAXD=15.0;
  6. const int L=30000;
  7. __int64 prime[L];
  8. __int64 List[100];
  9. int length;
  10. int LLen=0;
  11. void Init(){
  12. prime[0]=2;
  13. prime[1]=3;
  14. prime[2]=7;
  15. length=3;
  16. for( int i=10; i<L; ++i ){
  17. int s=int(sqrt(i));
  18. bool flag=true;
  19. for( int j=2; j<=s && flag; ++j )
  20. if( i%j==0 ) flag=false;
  21. if( flag ){
  22. int temp=i-1;
  23. for( int k=0; k<length; ++k ){
  24. while( temp%prime[k]==0 ){
  25. temp/=prime[k];
  26. }
  27. }
  28. if( temp==1 ){
  29. prime[length++]=i;
  30. }
  31. }
  32. }
  33. }
  34. int element[5];
  35. double log_p[5];
  36. int expon[5];
  37. int count1=0;
  38. void fun(double sum, int level, int maxlen, double MAXD){
  39. if( level==maxlen+1 ){
  40. __int64 number=1, phi=1;
  41. for( int j=0; j<=maxlen; ++j ){
  42. __int64 temp=element[j];
  43. for( int k=0; k<expon[j]; ++k )
  44. number*=temp;
  45. for( k=0; k<expon[j]-1; ++k )
  46. phi*=temp;
  47. phi*=temp-1;
  48. }
  49. __int64 t=number;
  50. int dig[100], index=0;
  51. bool flag=true;
  52. while( t && flag ){
  53. dig[index]=t%10;
  54. t/=10;
  55. if( dig[index]==0 || number%dig[index]!=0 )
  56. flag=false;
  57. else
  58. index++;
  59. }
  60. if( flag ){
  61. int i;
  62. int road[4]={0,0,0,0};
  63. int less_than10[4]={2,3,5,7};
  64. for( i=0; i<sizeof(road)/sizeof(road[0]); ++i ){
  65. for( int j=0; j<=maxlen; ++j ){
  66. if( element[j]==less_than10[i] )
  67. road[i]=expon[j];
  68. }
  69. }
  70. __int64 Tot=0;
  71. for( int k=0; k<index; ++k ){
  72. switch( dig[k] ){
  73. case 1 :
  74. Tot+=phi;
  75. break;
  76. case 2 :
  77. if( road[0]>1 )
  78. Tot+=phi/2;
  79. else
  80. Tot+=phi;
  81. break;
  82. case 3 :
  83. if( road[1]>1 )
  84. Tot+=phi/3;
  85. else
  86. Tot+=phi/2;
  87. break;
  88. case 4 :
  89. if( road[0]>2 )
  90. Tot+=phi/4;
  91. else
  92. Tot+=phi/2;
  93. break;
  94. case 5 :
  95. if( road[2]>1 )
  96. Tot+=phi/5;
  97. else
  98. Tot+=phi/4;
  99. break;
  100. case 6 :
  101. if( road[0]>1 ){
  102. if( road[1]>1 )
  103. Tot+=phi/6;
  104. else//2^k*3^1
  105. Tot+=phi/4;
  106. }
  107. else{
  108. if( road[1]>1 )
  109. Tot+=phi/3;
  110. else//2^1*3^1
  111. Tot+=phi/2;
  112. }
  113. break;
  114. case 7 :
  115. if( road[3]>1 )
  116. Tot+=phi/7;
  117. else
  118. Tot+=phi/6;
  119. break;
  120. case 8 :
  121. if( road[0]>3 )
  122. Tot+=phi/8;
  123. else
  124. Tot+=phi/4;
  125. break;
  126. case 9 :
  127. if( road[1]>2 )
  128. Tot+=phi/9;
  129. else
  130. Tot+=phi/6;
  131. break;
  132. }
  133. }
  134. if( Tot==number ){
  135. printf("%I64d\n",number);
  136. List[LLen++]=number;
  137. }
  138. }
  139. return;
  140. }
  141. for( int i=1; sum+i*log_p[level]<MAXD; ++i ){
  142. expon[level]=i;
  143. fun( sum+i*log_p[level], level+1, maxlen, MAXD );
  144. expon[level]=0;
  145. }
  146. }
  147. void calc(int *list, int len){
  148. int i;
  149. for( i=0; i<=len; ++i )
  150. log_p[i]=log10(element[i]);
  151. fun( 0, 0, len, MAXD );
  152. }
  153. void dfs( int index, int level ){
  154. int i;
  155. if( level==5 ){
  156. calc( element, level-1 );
  157. return;
  158. }
  159. for( i=index; i<length; ++i ){
  160. __int64 temp=prime[i]-1;
  161. for( int k=0; k<level; ++k ){
  162. while( temp%element[k]==0 ) temp/=element[k];
  163. }
  164. if( temp==1 ){
  165. element[level]=prime[i];
  166. dfs( index+1, level+1 );
  167. calc( element, level );
  168. element[level]=0;
  169. }
  170. }
  171. }
  172. void start(){
  173. int head[]={2,3,5,7};
  174. for( int i=0; i<sizeof(head)/sizeof(head[0]); ++i ){
  175. element[0]=head[i];
  176. dfs( i+1, 1 );
  177. }
  178. }
  179. int main(){
  180. Init();
  181. start();
  182. cout<<"========================================\n";
  183. sort( List, List+LLen );
  184. __int64 *end=unique( List, List+LLen );
  185. for( int i=0; List+i!=end; ++i )
  186. printf("%I64d\n",List[i]);
  187. return 0;
  188. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-8-18 19:07:40 | 显示全部楼层
结果(1这个显然的解不在搜索范围内): 211896 61341696 141732864 219483432 1423392768 4844814336 16484622336 23362267824 28193299344 169699442688 993338339328 2344883866416 8829641374848 423732883488768
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-8-24 15:58:12 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 02:09 , Processed in 0.021392 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表