其他分享
首页 > 其他分享> > 1542C-Strange Function (数学,lcm)

1542C-Strange Function (数学,lcm)

作者:互联网

C. Strange Function

题意

  给定一个\(n\),定义\(f(i)\)为最小的不是\(i\)因子的正整数\(x\),求\(\sum_{i=1}^{n}f(i)\)对\(10^9+7\)取模后的值。

思路

  首先考虑到由于\(1<=n<=10^{16}\),如果我们直接利用循环求解肯定是无法满足时限要求的。我们需要将思路转换成如何能够将这些数字分成某些组后计算。现在考虑\(f(x)=i\),按照题目的定义,\(x\)必定要有\(2,3,4,\dots,i-1\)这些因子,并且有\(x>=lcm(2,3,4,\dots,i-1)\)。当我们计算\(n/lcm(2,3,4,\dots,i-1)\),我们得到的就是能被这些数整除的数的个数,同样,我们再计算\(n/lcm(2,3,\dots,i)\)时,就得到了前面计算到\(i-1\)时,能被\(i\)整除的个数,相减后我们就能够得到\(f(x)=i\)的元素个数。因此结果就是统计所有满足\(i\)条件的总和即可。

代码

点此展开
//Author:Daneii
#include <bits/stdc++.h>
using namespace std;
#define lin(x) scanf("%lld",&x)
typedef long long ll;

const int N=1e5+10;
const int mod=1e9+7;

int main()
{
    int _=1;
    in(_);
    while(_--)
    {
        ll n;
        lin(n);

        ll lcm=1;
        ll ans=0;
        for(ll i=2;;i++)
        {
            ll reached=n/lcm;
            lcm=lcm*i/__gcd(lcm,i);
            ll sub=n/lcm;
            ll add=(reached-sub)*i%mod;
            ans=(ans+add)%mod;
            if(lcm>n) break;
        }

        cout<<ans%mod<<endl;
    }

    return 0;
}

标签:Function,dots,int,ll,Strange,ans,lcm,mod
来源: https://www.cnblogs.com/Daneyx/p/15319046.html