C. Strange Function(lcm+容斥)
思路
f[x]表示不被x整除的最小的数,设其为a,则对x必存在因子1,2…a-1,也就是说x存在约数a1=lcm(1,2,3,…a-1),由于a不被整除,所以x不存在约数a2=lcm(1,2,…a),在1-n中a1的倍数有n/a1个,a2的倍数有n/a2个,由于a1|a2,所以是a1倍数但不是a2倍数的有n/a1-n/a2个,且这些数的大小为a,循环到lcm大于n的时候停止即可
代码
#include<bits/stdc++.h>
#define int long long
const int mod=1e9+7;
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
void solve()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int lcmm=1;
int tmp=2;
int res=0;
while(lcmm<=n)
{
int k1=n/lcmm;
lcmm=lcm(lcmm,tmp);
tmp++;
int k2=n/lcmm;
res+=(k1-k2)*(tmp-1);
res%=mod;
}
cout<<res<<endl;
}
}
signed main()
{
solve();
return 0;
}