鱼C论坛

 找回密码
 立即注册
查看: 1678|回复: 4

题目684:颠倒数位和

[复制链接]
发表于 2020-4-24 09:45:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 永恒的蓝色梦想 于 2020-4-24 09:52 编辑

这个标题难搞哦……

                               
登录/注册后可看大图


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-24 10:36:02 | 显示全部楼层
woc......
一个初中学历的学生表示不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-24 23:09:28 | 显示全部楼层
本帖最后由 代号-K 于 2020-4-24 23:12 编辑

i = 10时 结果:8042614
提供个思路,可以用python 跑一下
void getInverseDigitSum(int start, int stop, int *sum){
    int i = start+1;
    int temp1, temp2;
    while(i <= stop){
        temp1 = (i+1) % 9;
        temp2 = (i+1) / 9;
        if(temp1 == 0){
            *sum += 9*(int)pow(10,temp2-1)-1;
        }else{
            *sum += temp1*(int)pow(10,temp2)-1;
        }
        i++;
    }
}

void getFibonacci(int flag, int *array){
   int a = 0;
   int b = 1;
   int c;
   int i = 2;
   array[0] = 0;
   array[1] = 1;
   while(i < flag){
       c = a;
       a = b;
       b = c + a;
       array[i++] = b;
   }
}

int main(int argc, char *argv[]){
    int answer = 1;
    int sum = 1;
    int array[100] = {0};
    getFibonacci(21, array);
    for(int i = 2; i < 10; i++){
        getInverseDigitSum(array[i],array[i+1],&answer);
        sum += answer;
        printf("%d\n",sum);
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 06:33:13 | 显示全部楼层
代号-K 发表于 2020-4-24 23:09
i = 10时 结果:8042614
提供个思路,可以用python 跑一下

大佬牛皮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-28 10:25:15 | 显示全部楼层
本帖最后由 guosl 于 2021-11-28 10:27 编辑

令k=n/9,r=n%9,则s(n)=r*10^k+9..(k个9)...9。应用这个思路加上9..(k个9)...9=10^k - 1 以及等比级数求和与快速幂的综合可以计算出最终结果:922058210,耗时不到1秒。
//答案:922058210
#include <iostream>
using namespace std;

const long long MOD = 1000000007ll;

long long f[100];

long long qpow(long long k)
{
  if (k == 0)
    return 1LL;
  else if (k == 1)
    return 10LL;
  long long t = 0;
  if ((k & 1) == 0)
  {
    t = qpow(k >> 1);
    t = t*t;
  }
  else
  {
    t = qpow(k - 1);
    t *= 10LL;

  }
  t %= MOD;
  return t;
}

int main(void)
{
  f[0] = 0;
  f[1] = 1;
  for (int i = 2; i < 100; ++i)
    f[i] = f[i - 1] + f[i - 2];
  long long lTS = 1, nS = 1;
  for (int i = 3; i <= 16; ++i)
  {
    long long tS = 0, t = 0;
    for (int j = int(f[i - 1]) + 1; j <= int(f[i]); ++j)
    {
      int k = int(j / 9), r = int(j % 9);
      t = qpow(k);
      t *= (r + 1);
      --t;
      tS += t;
    }
    nS += tS;
    lTS += nS;
  }
  lTS %= MOD;
  for (int i = 17; i <= 90; ++i)
  {
    long long k1 = (f[i - 1] + 1) / 9;
    long long k2 = f[i] / 9;
    int r = int((f[i - 1] + 1) % 9);
    long long tS = 0, t = 0;
    for (int r1 = r; r1 < 9; ++r1)
    {
      t = qpow(k1);
      t *= (r1 + 1);
      --t;
      if (t < 0)
        t += MOD;
      t %= MOD;
      tS += t;
      tS %= MOD;
    }
    ++k1;
    if (k2 > k1)
    {
      t = qpow(k2 - k1);
      --t;
      if (t < 0)
        t += MOD;
      long long t1 = qpow(k1);
      t *= t1;
      t %= MOD;
      t *= 5;
      t -= 9 * (k2 - k1);
      if (t < 0)
        t += MOD;
      t %= MOD;
      tS += t;
      tS %= MOD;
    }
    r = int((f[i]) % 9);
    for (int r1 = 0; r1 <= r; ++r1)
    {
      t = qpow(k2);
      t *= (r1 + 1);
      --t;
      if (t < 0)
        t += MOD;
      t %= MOD;
      tS += t;
      tS %= MOD;
    }
    nS += tS;
    nS %= MOD;
    lTS += nS;
    lTS %= MOD;
  }
  cout << lTS << endl;
  return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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