1 条题解

  • 0
    @ 2025-8-24 21:57:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Green_Hand
    **

    搬运于2025-08-24 21:57:32,当前版本为作者最后更新于2018-12-22 15:15:39,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    此题做法:找规律

    • 首先,我们需要分析什么样的数才能满足条件
    • 我们通过一波打表就可以发现 Di=(i1)mod9+1D_i=(i-1)\bmod9+1
    • 接着,我们可以发现满足下列条件之一就满足条件
      • (x/21)mod9+1=2(x/2-1)\bmod9+1=2
      • (x/31)mod9+1=3(x/3-1)\bmod9+1=3
      • \dots\dots
      • (x/81)mod9+1=8(x/8-1)\bmod9+1=8
      • (x/91)mod9+1=9(x/9-1)\bmod9+1=9
    • 经过一系列简化,可得
      • xmod9=1x\bmod9=1
      • xmod18=4x\bmod18=4
      • \dots\dots
      • xmod72=64x\bmod72=64
      • xmod81=0x\bmod81=0
    • 由于22680=lcm(9,18,27,36,45,54,63,72,81)22680 = lcm(9,18,27,36,45,54,63,72,81)amodb=(a+bc)modba \bmod b = (a + bc) \bmod b
    • 所以可得
      • xmod9=(x+22680)mod9x\bmod9=(x+22680)\bmod9
      • xmod18=(x+22680)mod18x\bmod18=(x+22680)\bmod18
      • \dots\dots
      • xmod72=(x+22680)mod72x\bmod72=(x+22680)\bmod72
      • xmod81=(x+22680)mod81x\bmod81=(x+22680)\bmod81
    • 即如果用boolbool数组存该数是否满足条件,那么这个数组是循环的,且循环长度为2268022680
    • 所以我们只需求出112268022680有哪些符合条件的数并维护前缀和即可
    • 附代码
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int N = 22680;
    typedef long long ll;
    int T; ll l,r,sum[N + 10];
    
    ll answer(ll x) { return sum[N] * (x / N) + sum[x % N]; }
    
    int main()
    {
    	for(int i = 1,x;i <= N; ++ i)
    		if((x = i * ((i - 1) % 9 + 1)) <= N) sum[x] = 1;
    	for(int i = 2;i <= N; ++ i) sum[i] += sum[i - 1];
    	for(scanf("%d",&T);T--;) scanf("%lld%lld",&l,&r),
    		printf("%lld\n",answer(r) - answer(l - 1ll));
    	return 0;
    }
    
    • 1

    信息

    ID
    3147
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者