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