Codeforces Round #729 (Div. 2)–C. Strange Function
思路
- 满足f(n)=i,即1,2,3…i-1都是n的倍数,即n为1,2,3…i-1的最小公倍数的整数倍
- 思路是i从1开始枚举,求满足f(k)=i等式的k的个数的和**(k<=n)**
- 当1,2,3…,i的最小公倍数大于n的时候,循环结束,因为n不可能是往后的1,2,3…i+1的最小公倍数的整数倍了
- 如何求k的个数呢,当k为lcm(1,2,3…,i-1)的最小公倍数的倍数且k不为lcm(1,2,3…,i)的最小公倍数的时候并且k<=n,f(k)=i,所以我们可以得到枚举表达式∑i>1 i*([n/lcm(1,2,…,i−1)]−[n/lcm(1,2,…,i)]).
求解
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll lc[42];
int main(){
int t;cin>>t;
lc[1]=1;
for(ll i=2;i<=41;i++){
lc[i]=(lc[i-1]*i)/(__gcd(lc[i-1],i));
}
while(t--){
ll n;cin>>n;
ll ans=0;
for(int i=2;;i++){
(ans+=i*(n/lc[i-1]-n/lc[i]))%=mod;
if(lc[i]>n)break;
}
cout<<ans<<endl;
}
}