1714: 三七过(New Online Judge)
题目描述
三七过是一个报数游戏。游戏规则从1开始报数, 在报数过程中跳过3的倍数和7的倍数。
也就是说,此时的报数序列为:1 2 4 5 8 10 11 13 16…
为了进一步提升难度,任意选择两个大于1的正整数x和y来替换3和7,请问第k个数字是多少。
输入
输入三个正整数x,y,k,x,y不超过100,k小于 1 0 9 10^9 109。
输出
输出一个数字表示答案。
样例输入
样例1
3 7 9
样例2
4 6 8
样例输出
样例1
16
样例2
11
提示信息
本题的题意是在报数过程中,跳过x的倍数和y的倍数
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF = 1e10 +7;
LL x, y, k;
LL gcd(LL a, LL b){ //求a,b的最小公约数
return a%b ? gcd(b, a % b) : b;
}
bool check(LL n){
LL num = n - n/x - n/y + n/(x/gcd(x, y)*y);
return num >= k ? true : false;
}
//容斥原理+二分答案
int main(){
scanf("%lld%lld%lld", &x, &y, &k);
LL l = 0, r = INF, mid;
while(l + 1 < r){
mid = l + (r - l)/2;
//printf("%lld ", mid);
if(check(mid)) r = mid;
else l = mid;
}
printf("%lld\n", r);
return 0;
}