题意:老板一天发x张代币券,员工能用它来换大洋,用w张代币券可换[a*w/b](下取整)块大洋,代币券只能当天适用,求换最多大洋时最多能留多少代币券
比如a=3,b=7,x=4时,我最多能换3×4/7=1块大洋,但是我显然用3张代币券就能换1块大洋,所以多的1块就应该被保留
设t为当天最多换得的大洋有t=a*x/b,因为是下取整,有不等式t<=ax/b成立,我们现在只要找一个最小的x使得不等式成立,为了讲变量区分开,设至少用y张代币券换t块大洋,有不等式t<=ay/b成立,化简得y>=bt/a,x-y即所求
注意数据范围a,b,x可达10^9,相乘将达到10^18,所以需要用long long(因为没用long long WA了半个小时)
- #include<cstdio>
- #include<iostream>
- #include<cstdlib>
- #include<algorithm>
- #include<ctime>
- #include<cctype>
- #include<cmath>
- #include<string>
- #include<cstring>
- #include<stack>
- #include<queue>
- #include<vector>
- #include<map>
- #define sqr(x) (x)*(x)
- #define LL long long
- #define INF 0x3f3f3f3f
- #define PI 3.14159265358979
- #define eps 1e-10
- #define mm
- using namespace std;
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("t","r",stdin);
- #endif
- long long n,a,b,t,y,l,r,mid;
- scanf("%I64d%I64d%I64d",&n,&a,&b);
- long long x,ans;
- for (int i=0;i<n;i++)
- {
- scanf("%I64d",&x);
- t=a*x/b;
- if ((t*b)%a==0)
- {
- y=t*b/a;
- }
- else
- {
- y=t*b/a + 1;
- }
- printf("%I64d ",x-y);
- }
- puts("");
- return 0;
- }