列表

详情


NC21546. 牛牛的最大公约数

描述


牛牛有一个区间[L,R]

需要选择N个数,这N个数都在这个区间范围内

那么我们知道一共有 种选法

假如我们想要这N个数的最大公约数恰好是K

请问一共有多少种选法,输出答案对1e9+7取模

输入描述

输入一行包含4个整数N,K,L,R (1 ≤ N, K, L ≤ 109, L ≤ R ≤ 109)

0 ≤ R - L ≤ 105

输出描述

对于每组数据输出一个整数

示例1

输入:

2 2 2 4

输出:

3

示例2

输入:

2 100 2 4

输出:

0

示例3

输入:

1 5 5 5 

输出:

1

示例4

输入:

73824 17347 9293482 9313482

输出:

0

示例5

输入:

222 222 222 22222

输出:

339886855

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 85ms, 内存消耗: 1316K, 提交时间: 2020-07-11 10:06:01

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,l,r,i,j,mod=1000000007,ans[100010],s;
ll pow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1)
            res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main()
{
    cin>>n>>k>>l>>r;
    for(i=1; i<=r-l+1; i++)
    {
        ll len=r/i-(l-1)/i;
        ans[i]=(pow(len,n)-len+mod)%mod;
    }
    for(i=r-l+1; i>=1; i--)
        for(j=2*i; j<=r-l+1; j+=i)
            ans[i]=(ans[i]-ans[j]+mod)%mod;
    if(r-l+1<=k)
        s=0;
    else
        s=ans[k];
    if(k<=r&&k>=l)
        s++;
    cout<<s<<endl;
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 134ms, 内存消耗: 1272K, 提交时间: 2019-08-28 16:07:58

#include<bits/stdc++.h>
using namespace std;

long long n,m,k,l,r,i,j,mod=1000000007,ans[100010],s;
long long pow(long long a,long long b)
{
	long long res=1;
	while(b)
	{
		if(b&1)
		{
			res=res*a%mod;	
		}
		a=a*a%mod;
		b/=2;
	}
	return res;
}
int main()
{
	scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
	for(i=1;i<=r-l+1;i++)
	{
		long long len=r/i-(l-1)/i;
		ans[i]=(pow(len,n)-len+mod)%mod;
	}
	for(i=r-l+1;i>=1;i--)
	{
		for(j=2*i;j<=r-l+1;j+=i)
		{
			ans[i]=(ans[i]-ans[j]+mod)%mod;
		}
	}
	if(r-l+1<=k)
	    s=0;
    else
        s=ans[k];
	if(k<=r&&k>=l)s++;
	printf("%lld\n",s);
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 190ms, 内存消耗: 27504K, 提交时间: 2021-05-10 20:15:32

#!/usr/bin/env python3
#
# NC21546 - 牛牛的最大公约数
#
import sys, os, math, functools

MOD = int(1e9 + 7)

n, k, l, r = map(int, input().split())
s = r - l + 1
a = [0] * (s + 1)
for i in range(1, s + 1):
	d = r // i - (l - 1) // i
	a[i] = (pow(d, n, MOD) - d + MOD) % MOD
for i in range(s, 0, -1):
	for j in range(i * 2, s + 1, i):
		a[i] = (a[i] - a[j] + MOD) % MOD
if k >= s:
	print(1 if l <= k <= r else 0)
else:
	if l <= k <= r: a[k] = (a[k] + 1) % MOD
	print(a[k])

上一题