Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <assert.h>
- #define nMoneyMax 10000010
- using namespace std;
- ifstream in("sipet.in");
- ofstream out("sipet.out");
- struct pereche {
- int a, b;
- };
- int nCases, nMoney, L, p[4];
- int A, B, C, R;
- pereche v[nMoneyMax];
- bool bb[nMoneyMax];
- bool isPrime(int x) {
- for ( int d = 2; d * d <= x; ++ d ){
- if ( x % d == 0 ){return false;}
- }
- return true;
- }
- int sqr(int x ) {
- return x * x;
- }
- void read(){
- in>>nCases;
- for(int t = 1; t <= nCases; ++t) {
- in>>nMoney>>p[1];
- assert(isPrime(p[1]));
- for (int i = 2; i <= 3; ++ i ){
- for (p[i] = p[i - 1] + 1; !isPrime(p[i]); ++ p[i]);
- }
- for (int a = 0; a * p[1] <= nMoney; ++a){
- for ( int b = 0; a * p[1] + b * p[2] <= nMoney && b < p[1]; ++b) {
- int pos = a * p[1] + b * p[2];
- v[pos].a = a;
- v[pos].b = b;
- bb[pos] = true;
- }
- }
- bool found = false; R = -1;
- for (int r = 0; r <= p[1] && R == -1; + r){
- for (int c = 0; r + c * p[3] <= nMoney && c <= p[1]; ++c) {
- int pos = c * p[3] + r;
- if ( bb[nMoney - pos] && (R == -1 || R != -1 && A + B + C < v[nMoney - pos].a + v[nMoney - pos].b + c )) {
- found = true;
- A = v[nMoney - pos].a;
- B = v[nMoney - pos].b;
- C = c;
- R = r;
- }
- }
- }
- for (int a = 0; a * p[1] <= nMoney; ++ a ){
- for (int b = 0; a * p[1] + b * p[2] <= nMoney && b < p[1]; ++ b ) {
- int pos = a * p[1] + b * p[2];
- bb[pos] = false;
- }
- }
- out<<A + B + C<<" "<<A<<" "<<B<<" "<<C<<" "<<R<<'\n';
- }
- }
- int main() {
- read();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement