洛谷P3172(莫比乌斯反演 + 杜教筛)

洛谷P3172

题意:
	在[L, H]中选n个数,它们的GCD为k有多少种方法?
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e6 + 7;
const ll mod = 1e9 + 7;
ll miu[N], v[N], sum[N];
map <ll, ll> m1;
ll power(ll a, ll b)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
void getmiu(int n)
{
    for(int i = 1; i <= n; i++)
        miu[i] = 1, v[i] = 0;
    for(int i = 2; i <= n; i++)
    {
        if(v[i])
            continue;
        miu[i] = -1;
        for(int j = 2 * i; j <= n; j += i)
        {
            v[j] = 1;
            if((j / i) % i == 0)
                miu[j] = 0;
            else
                miu[j] *= -1;
        }
    }
    for(int i = 1; i <= n; i++)
        sum[i] = sum[i - 1] + miu[i];
}
ll getans(ll x)
{
    if(x <= 5000000)
        return sum[x];
    if(m1[x])   return m1[x];
    ll ans = 1;
    ll l, r;
    for(l = 2; l <= x; l = r + 1)
    {
        r = x / (x / l);
        ans -= getans(x / l) * (r - l + 1);
    }
    return m1[x] = ans;
}
int main()
{
    getmiu(5000000);
    ll n, k, l, r;
    scanf("%lld %lld %lld %lld", &n, &k, &l, &r);
    l = (l + k - 1) / k - 1, r = r / k;
    ll ans = 0;
    ll i, j;
    for(i = 1; i <= r; i = j + 1)
    {
    
        j = r / (r / i);
        if(l >= i)
            j = min(j, l / (l / i));
        ll ans1 = getans(j) - getans(i - 1);
        ans1 = (ans1 % mod + mod) % mod;
        ll ans2 = power(r / i - l / i, n);
        ans2 = (ans2 % mod + mod) % mod;
        ans1 = ans1 * ans2 % mod;
        ans = (ans + ans1) % mod;
    }
    ans = (ans % mod + mod) % mod;
    printf("%lld\n", ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值