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

[擂台] Ten digit numbers

[复制链接]
发表于 2025-11-5 08:08:09 | 显示全部楼层
上面的公式有个问题,没有考虑到对于越大的数,对应的计算量越大。由于我们实际计算过程都是一个超大整数乘上一个小于\(10^{10}\)的整数
所以实际上每次乘法本身就是O(n)的,由此总体复杂度可以表示为
\(\sum_{x=10^9}^{10^{10}-1}\frac{x\ln(0.1)}{\ln(10^{-10}x)}\approx 10^{20}\ln(0.1)(Ei(2\ln(1-10^{-10}))-Ei(2\ln(0.1)))\).
而计算过程中,如果我们从\(10^9\)已经计算到\(10^{10}-10^7\),那么我们就可以估算出计算过程已经占了整体计算量的
\(\frac{Ei(2\ln(0.999))-Ei(2\ln(0.1)))}{Ei(2\ln(1-10^{-10}))-Ei(2\ln(0.1)))} \approx 0.2088\)
通过这种方法可以估算出完成整个计算大概需要8K CPU日左右, 对于现代多核处理器也不是不能完成,就是时间略微长了点,如果能够优化一下会更好。
  1. #include <math.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <time.h>

  5. #define SN 501
  6. #define MP 100000000

  7. #define MOD 10000000000L
  8. #define HMOD 100000

  9. char dc[HMOD][10];
  10. void initdc()
  11. {
  12.   int i;
  13.   for(i=0;i<HMOD;i++){
  14.     int j;
  15.     int x=i;
  16.     for(j=0;j<5;j++){
  17.       dc[i][x%10]++;
  18.       x/=10;
  19.     }
  20.   }
  21. }

  22. void get_count(long v[],int length, int count[10])
  23. {
  24.   int i;
  25.   for(i=0;i<10;i++)count[i]=0;
  26.   for(i=0;i<length;i++){
  27.     int x=v[i]%HMOD;
  28.     int y=v[i]/HMOD;
  29.     int j;
  30.     for(j=0;j<10;j++){
  31.       count[j]+=dc[x][j]+dc[y][j];
  32.     }
  33.   }
  34. }

  35. bool mulby(long v[], int length, long m)
  36. {
  37.   int i;
  38.   long carry=0L;
  39.   for(i=0;i<length;i++){
  40.     __int128_t prod = (__int128_t)v[i]*m+carry;
  41.     v[i]=prod%MOD;
  42.     carry=prod/MOD;
  43.   }
  44.   v[length]=carry;
  45.   return carry>=(MOD/10);
  46. }

  47. int main()
  48. {
  49.     double sv=pow(0.1,1.0/SN)*MOD;
  50.     long is = (long)ceil(sv);
  51.     initdc();
  52.     time_t start=time(NULL);
  53. #pragma omp parallel
  54.     {
  55.       long *data = (long *)malloc((MP+1)*sizeof(long));
  56. #pragma omp for schedule(dynamic)
  57.     for(long i=is;i<MOD;i++){
  58.             int count[10];
  59.       data[0]=i;
  60.         int j;
  61.         for(j=2;j<=MP;j++){
  62.     if(!mulby(data,j-1,i))break;
  63.     if(j<SN)continue;
  64.     get_count(data,j,count);
  65.             int k;
  66.             for(k=0;k<10;k++)if(count[k]!=j)break;
  67.             if(k==10){
  68. #pragma omp critical
  69.                     {
  70.                         printf("%ld^%d\n",i,j);
  71.                               fflush(stdout);
  72.                     }
  73.             }
  74.         }
  75. #pragma omp critical
  76.         if(i%1000000==0)
  77.         {
  78.                 time_t now=time(NULL);
  79.                 fprintf(stderr,"%ld cost %ld\n",i,now-start);
  80.                 fflush(stderr);
  81.         }
  82.     }
  83.     }
  84.     printf("done!\n");
  85.     return 0;
  86. }
复制代码

评分

参与人数 1威望 +8 金币 +8 贡献 +8 经验 +8 鲜花 +8 收起 理由
northwolves + 8 + 8 + 8 + 8 + 8 神马都是浮云

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-11-6 07:07:00 | 显示全部楼层
小心翼翼的问。

一个10位数, 其n次方恰好含0-9各n次。——这是主帖。
一个9位数, 其n次方恰好含0-9各n次。——会有吗?
一个8位数, 其n次方恰好含0-9各n次。——会有吗?
一个7位数, 其n次方恰好含0-9各n次。——会有吗?

一个10位数, 其n次方恰好含0-9各n次。——这是主帖。
一个11位数, 其n次方恰好含0-9各n次。——会有吗?
一个12位数, 其n次方恰好含0-9各n次。——会有吗?
一个13位数, 其n次方恰好含0-9各n次。——会有吗?

点评

没问好:一个k位数, 其n次方恰好含(1-k的个位数)各n次。——删了。删不了。  发表于 2025-11-7 04:50
除了第一个都不可能  发表于 2025-11-6 20:15
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-11-7 09:43:07 | 显示全部楼层
比较让人以外的是mulby中除法编译并没有进行优化,可以手工优化一下
  1. bool mulby(long v[], int length, long m)
  2. {
  3.   int i;
  4.   long D=990352031428304219L;
  5.   long carry=0L;
  6.   for(i=0;i<length;i++){
  7.     __int128_t prod = (__int128_t)v[i]*m+carry;
  8.     long val = (long)((prod*D)>>93);
  9.     long res=(long)(prod-val*(__int128_t)MOD);
  10.     if(res>=MOD){
  11.             val++;res-=MOD;
  12.     }
  13.     v[i]=res;
  14.     carry=val;
  15.   }
  16.   v[length]=carry;
  17.   return carry>=(MOD/10);
  18. }
复制代码

另外现在代码里面
long *data = (long *)malloc((MP+1)*sizeof(long));
需要对于比较大的MP需要分配比较大的内存,如果线程数目多的话对于内存压力很大,实际计算过程就需要对于大的MP采用较少线程数目来节省内存开销。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2025-11-25 01:36 , Processed in 0.023764 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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