列表

详情


NC21335. 倍集

描述

S1 和 S2是两个整数的集合,如果S1里面的每一个数x都存在一个S2里面的y是x的倍数
那么我们称S2是S1的倍集
给你四个整数A,B,C,D
有一个集合S包含所有的x满足 A <= x <= B  C <= x <= D
求出S的一个元素最少的子集T,使得T是S的倍集
你只需要输出T的元素的个数即可

输入描述

输入一行包含四个整数A,B,C,D 
1 ≤ A ≤ 1010
A ≤ B ≤ 1010
B + 1 ≤ C ≤ 1010
C ≤ D ≤ 1010

输出描述

输出一个整数

示例1

输入:

1 1 2 2

输出:

1

示例2

输入:

1 2 3 4

输出:

2

示例3

输入:

2 3 5 7

输出:

3

示例4

输入:

1 10 100 1000

输出:

500

示例5

输入:

1000000000 2000000000 9000000000 10000000000

输出:

1254365078

原站题解

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

pypy3(pypy3.6.1) 解法, 执行用时: 72ms, 内存消耗: 20184K, 提交时间: 2020-09-22 22:55:30

a,b,c,d=map(int,input().split())
a=max(a,b//2+1)
c=max(c,d//2+1)
left=a
ans=int(d-c+1)
try:
    while left<=d:
        k=int(d//left)
        right=int(min(b,(c-1)//k))
        if right>=left:
            ans+=int(right-left+1)
        left=int(d//k+1) #每次k减1
    else:
        print(int(ans))
except:
    pass

C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 628K, 提交时间: 2020-04-12 21:39:18

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll a,b,c,d;
    cin>>a>>b>>c>>d;
    a=max(a,b/2+1);
    c=max(c,d/2+1);
    ll ans=d-c+1;
    for(ll k,r;a<=d;a=d/k+1){
        k=d/a;
        r=min((c-1)/k,b);
        if(r>=a)ans+=r-a+1;
    }
    cout<<ans<<endl;
}

C 解法, 执行用时: 4ms, 内存消耗: 436K, 提交时间: 2022-10-16 16:32:45

#include<stdio.h>
int main()
{
	long long A,B,C,D,sum=0,r,x,l,k;
	scanf("%lld%lld%lld%lld",&A,&B,&C,&D);
	A=A>B/2+1?A:B/2+1;
	C=C>D/2+1?C:D/2+1;
	sum=D-C+1;
	C--;
	for(l=A;l<D;l=D/k+1){
		k=D/l;
		x=C/k;
		r=B<x?B:x;
		if(r>=l)sum+=r-l+1;
		if(x>=B)break;
	}
	printf("%lld\n",sum);
	return 0;
} 

Python3 解法, 执行用时: 129ms, 内存消耗: 6984K, 提交时间: 2021-07-19 07:49:55

a,b,c,d=map(int,input().split())
a=max(a,b//2+1)
c=max(c,d//2+1)#注意内置函数的应用
left=a
ans=d-c+1
while left<=b:
    k=d//left
    right=min(b,(c-1)//k)#c//k
    if right>=left:
        ans+=right-left+1
    left=d//k+1
else:#自然结束该循环执行的语句。
    print(ans)

上一题