Problem A: qwb与支教

来源:互联网 发布:关于网络组建的论文 编辑:程序博客网 时间:2024/05/09 13:41

Description

qwb同时也是是之江学院的志愿者,暑期要前往周边地区支教,为了提高小学生的数学水平。她把小学生排成一排,从左至右从1开始依次往上报数。

玩完一轮后,他发现这个游戏太简单了。于是他选了3个不同的数x,y,z;从1依次往上开始报数,遇到x的倍数、y的倍数或z的倍数就跳过。如果x=2,y=3,z=5;第一名小学生报1,第2名得跳过2、3、4、5、6,报7;第3名得跳过8、9、10,报11。

那么问题来了,请你来计算,第N名学生报的数字是多少?

Input

多组测试数据,处理到文件结束。(测试数据数量<=8000)

每个测试例一行,每行有四个整数x,y,z,N。( 2≤x,y,z≤107,1≤N≤1017)。

Output

对于每个测试例,输出第N名学生所报的数字,每个报数占一行。

Sample Input

2 3 5 26 2 4 10000

Sample Output

7

19999

二分?!

附上杭电曹大神的代码。

哭,这场比赛什么题目都T。

#include<bits/stdc++.h>using namespace std;const int inf=(1<<30)-1;const int maxn=100010;#define REP(i,n) for(int i=(0);i<(n);i++)#define FOR(i,j,n) for(int i=(j);i<=(n);i++)typedef long long ll;ll a[3];ll b[3];ll t;ll n;  ll lcm(ll x,ll y) {return x/__gcd(x,y)*y;}ll check(ll x){ll tt=x;for(int i=0;i<3;i++) tt-=x/a[i];for(int i=0;i<3;i++) tt+=x/b[i];tt-=x/t;return tt;}int main(){while(~scanf("%lld%lld%lld%lld",&a[0],&a[1],&a[2],&n)){b[0]=lcm(a[0],a[1]);b[1]=lcm(a[0],a[2]);b[2]=lcm(a[1],a[2]);t=lcm(b[1],b[2]);ll L=0,R=n*10;ll ans=0;while(L<=R){ll M=(L+R)>>1;if(check(M)>=n) {R=M-1;ans=M;}else L=M+1;}printf("%lld\n",ans);}return 0;}

阅读全文
0 0
原创粉丝点击