Crime and Punishment
Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
Petty bureaucrat Victor Thiefton was disposed towards stealing from his childhood. But one thing is to legally privatize national factories, diamond fields and oil derricks at the cost of billions dollars. And another thing is to filch some money from a poor regional budget. Our legislation is very strict. Therefore Victor felt that justice is on the alert just after he extracted his hand from the national pocket. What should he do to escape inevitable punishment?
Mr. Thiefton has once heard that in accordance with the criminal legislation standards he would be condemned to long imprisonment for a theft whereas in case of a peculation he could escape with a suspended sentence only. So if the most part of stolen money is peculated, the duration of imprisonment will be reduced.
The same evening Mr. Thiefton burst into "MegaApril" superstore and rushed for overflowing storefronts carrying a purse with N stolen dollars. It appeared that unlimited number of high-quality goods and goods at moderate price were on sale in the superstore. High-quality goods cost A dollars per piece, and goods at moderate price cost B dollars per piece. Victor should spend as much stolen money as possible to reduce the duration of imprisonment to a minimum.
Input
The only line contains the integer numbers A, B and N (1 ≤ A, B, N ≤ 2∙109).
Output
You should output the number of high-quality goods and the number of goods at moderate price, which should be bought to guarantee the minimal duration of imprisonment for Victor. The numbers should be separated by single space. If the problem has several solutions, you should output any of them.
Sample Input
input
output
8 5 22
2 1
一下东西都是摘抄的,囧
题目大意:给出a,b,N,要你找出自然数x,y满足:N-(a*x+b*y)最小,如果有多组解是,输出任意一组。
::做法貌似是暴力加贪心。
view code#include <cstdio> #include <iostream> using namespace std; int main(){ int a, b, n; scanf("%d%d%d", &a, &b, &n); int flag = 0; if(a < b) swap(a,b), flag = 1; int x = n / a; n %= a; int y = n / b; n %= b; int ans = n, ansx = x, ansy = y; for(int i = 1, end = min(x,b); i <= end; i++){// 如果有 n / a > b时,那么一定会枚举都某个i,i = (b + x),那么 a * (b + x) = a * b + a * x,那么b个a就可以用a个b来表示 x--, n += a, y += n / b, n %= b; if(n < ans) ans = n, ansx = x, ansy = y; } if(flag) swap(ansx, ansy); printf("%d %d\n", ansx, ansy); return 0; }