-
題意: \(f(i)=x\),\(x\)為最小的不能整除\(i\)的數.求\(\sum^{n}_{i=1}f(i)\ mod\ 10^9+7\).
-
題解:首先,\(1,2,...,x-1|i\),即\(i\)一定是\(lcm(1,2,...,x-1)\)的倍數,我們現在來看\(f(i)\)的值,當\(f(i)=2\)時,\(i\)的最小值是\(1\),\(f(i)=3\)時,\(i\)的最小值是\(2\),\(f(i)=4\)時,\(i\)的最小值是\(6\),因為\(lcm(1,2,3)=6\).以此類推,最后發現\(f(i)=43\)時,\(i\ge10^{16}\).因為\(f(i)\)最小為\(2\),所以\(ans\)初始化為\(2*n\).然后接下來我們要計算答案,可以從小到大線性枚舉\(f(i)\)的值,比如說\(f(i)=4\),最小的\(i\)為\(6\),那么對於所有的\(i=k*6\),它都包含\((1,2,3)\),所以當前這個因子可以選,答案因子還在后面(因為線性,所以+1),那么當前貢獻就要+1,即\(ans+=n/lcm(1,2,3)\).以此類推即可得到答案.
-
代碼:
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b;a<=c;++a) #define per(a,b,c) for(int a=b;a>=c;--a) const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int _; cin>>_; while(_--){ ll n; cin>>n; ll ans=n*2; ll cur=1; for(int i=3;i<=43;++i){ cur=lcm(cur,i-1); ans=(ans+n/cur)%mod; } cout<<ans<<'\n'; } return 0; }