Codeforces Round #729 (Div. 2) C. Strange Function (數學)


  • 題意: \(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;
    }
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM