C. Strange Function (思维+数论)

墨蓝 2022-09-13 06:19 323阅读 0赞

在这里插入图片描述
1 2 3 . . . x − 1 1 \ 2 \ 3 \ … \ x-1 1 2 3 … x−1 是 i i i 的因子, x x x 不是 i i i 的因子

容易得出 l c m ( 1 , 2 , . . . , x − 1 ) lcm(1, 2, …,x-1) lcm(1,2,…,x−1) 是 i i i 的因子,但 l c m ( 1 , 2 , 3… , x − 1 , x ) lcm(1, 2, 3…,x-1, x) lcm(1,2,3…,x−1,x) 不是 i i i 的因子

对于 i i i 贡献的数,这些数的因子包含 1 , 2 , … , i − 1 1,2,…,i-1 1,2,…,i−1的最小公倍数且不包含 i i i 这个因子,因子包含 1 , 2 , … , i − 1 1,2,…,i-1 1,2,…,i−1的最小公倍数的数的个数为 n / l c m ( 1 , 2 , … , i − 1 ) n/lcm(1,2,…,i-1) n/lcm(1,2,…,i−1),这些数中部包含因子i的个数为 n / l c m ( 1 , 2 , … , i ) n/lcm(1,2,…,i) n/lcm(1,2,…,i)

通过简单的容斥, i i i 的贡献为上述两数之差再乘以 i i i 即可。

题解来源

  1. const int mod = 1e9 + 7;
  2. ll a[50];
  3. ll gcd(ll a, ll b){ return b ? gcd(b,a%b):a;}
  4. void solve()
  5. {
  6. ll n;
  7. cin >> n;
  8. a[1] = 1;
  9. for(int i=2;;i++)
  10. {
  11. a[i] = a[i-1] * i / gcd(a[i-1],i);
  12. if(a[i] > 1e16+100) break;
  13. }
  14. ll res = 0;
  15. for(int i=2;;i++)
  16. {
  17. ll x = n/a[i-1], y = n/a[i];
  18. res = (res + i*(x-y))%mod;
  19. if(!y) break;
  20. }
  21. cout << res << endl;
  22. }

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数论c

    c 【题目描述】 给定一个正整数n,在\[1,n\]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b。 【输入格式】 输入共一行,一

    相关 C. Strange Birthday Party(贪心)

    [题目][Link 1] 题意:我有n个朋友,商店有m种商品,这m种商品按序号价格从小到大排列,对于每一个朋友我给出一个序号k,我可以直接给朋友序号k的商品价格的金钱或给