题目大意:
设f(i)=(i不能整除的最小数字)
给你t个数字
每个数字给你一个n
问你
∑
i
=
1
n
f
(
i
)
\sum_{i=1}^{n}f(i)
∑i=1nf(i)是多少
思路:
我们对于每个n我们要找i不能整除的最小数字
先说结论
我们设g(x)=lcm(1,2,3,······,x) (lcm是最小公倍数的意思
ans+=(n/g(x-1)-n/g(x))*x
n/g(x-1)-n/g(x)代表的意思是1到n之间有多少个数字是不能整除x的数字
x就是他们f(i)的值(或者说对答案的贡献
举个例子
n中f(i)=2的数量其实就是n中g(1)的倍数-n中g(2)的倍数(i<=n)
那么f(i)=x的数量是 g(x-1)倍数数量-g(x)倍数数量(i<=n)
这样就得出结果
直接算就可以了
(也可以打表,但这个复杂度其实挺低的不用打表也可以过,还有注意一下中间结果取模就好了
AC代码:
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main()
{
int t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
ll p=1;
ll ans=0;
for(ll i=2;p<=n;i++){
ll q=p;
p=p*i/gcd(p,i);//最小公倍数
ans+=(n/q-n/p)%mod*i%mod;
ans%=mod;
}
cout<<ans<<endl;
}
return 0;
}