Optimize the Mobius function template

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdbool.h>
#define int long long

using namespace std;
const int maxn = 2e5 + 10;

int tot, prime[maxn], miu[maxn], sumu[maxn];
bool valid[maxn];

void acc_ios()
{
    
    
   ios::sync_with_stdio(false);
   cin.tie(0);
}

void getmiu()
{
    
    
    tot = 0;
    memset(valid, true, sizeof(valid));
    valid[0] = valid[1]  = false;
    miu[1] = 1;
    sumu[1] = 1;
    for(int i = 2; i < maxn; i++)
    {
    
    
        if(valid[i])
        {
    
    
            prime[tot++] = i;
            miu[i] = -1;
        }
        for(int j = 0; j < tot && prime[j] * i < maxn; j++)
        {
    
    
            valid[prime[j] * i] = false;
            if(i % prime[j] == 0)
            {
    
    
                miu[i * prime[j]] = 0;
                break;
            }
            else
                miu[i * prime[j]] = -miu[i];
        }
        sumu[i] = sumu[i - 1] + miu[i];
    }
}

int cal(int a, int b)
{
    
    
    int ans = 0;
    for(int i = 1, last; i <= min(a, b); i = last + 1)
    {
    
    
        //printf("%d\n", i);
        last = min((a /(a / i)), (b / (b / i)));
        ans += (sumu[last] - sumu[i - 1]) * (a / i) * (b / i);
    }
    return ans;
}

signed main()
{
    
    
    acc_ios();
    getmiu();
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int a, b, c, d, k;
        cin>>a>>b>>c>>d>>k;
        a--, c--;
        a /= k, b /= k, c /= k, d /= k;
        cout<<cal(b, d) + cal(a, c) - cal(b, c) - cal(a, d)<<endl;
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_43891021/article/details/108248322