#include "dzilib.h" #include <vector> /* #include <iostream> */ /* #include "../../simple-console-debug/debug.h" */ int find_seq_in_seq(const std::vector<short>& Main, const std::vector<short>& Sub) { for (int i=0; i<(int)Main.size()-(int)Sub.size()+1; i++) { bool success = true; for (int j=0; j<(int)Sub.size(); j++) if (Main[i+j]!=Sub[j]) { success = false; break; } if (success) { return i; } } throw; } int find_seq_in_seq_with_hint(const std::vector<short>& Main, const std::vector<short>& Sub, const std::vector<int>& Hint) { for (int i : Hint) { bool success = true; for (int j=0; j<(int)Sub.size(); j++) if (Main[i+j]!=Sub[j]) { success = false; break; } if (success) { return i; } } throw; } void solve_by_precomputing_nod() { int t = GetT(); std::vector<short> NOD(1000032, 1); NOD[0] = -1; for (int d=2; d<1000032; d++) for (int w=d; w<1000032; w+=d) NOD[w]++; std::vector<std::vector<int>> Hints(241); for (int i=1; i<=1000000; i++) Hints[NOD[i]].push_back(i); /* std::cerr << "NOD = " << deb::Container(NOD) << std::endl; */ for (int z=0; z<t; z++) { std::vector<short> Seq(32); for (int i=0; i<32; i++) Seq[i] = Ask(i); /* std::cerr << "SEQ = " << deb::Container(Seq) << std::endl; */ Answer(find_seq_in_seq_with_hint(NOD, Seq, Hints[Seq[0]])); } } void solve_by_prime_distances() { int t = GetT(); const int UP = 1000001000; std::vector<bool> Sieve(UP+1); std::vector<short> Diffs; std::vector<int> Primes; int last_prime = 2; Diffs.reserve(51000000); Primes.reserve(51000000); Primes.push_back(2); for (unsigned int i=3; i<=UP; i+=2) if (!Sieve[i]) { Primes.push_back(i); Diffs.push_back(i-last_prime); last_prime=i; for (long long j=(long long)i*i; j<=UP; j+=2*i) Sieve[j] = true; } /* std::cerr << "Primes ready" << std::endl; */ for (int z=0; z<t; z++) { const int RD = 15; // required diffs std::vector<short> PrimeYs; int first_y = -1; for (int y=0; (int)PrimeYs.size() <= RD; y++) if (Ask(y) == 2) { if (first_y == -1) first_y = y; PrimeYs.push_back(y); } /* std::cerr << "SubPrimes ready" << std::endl; */ std::vector<short> Seq(RD); for (int i=0; i<RD; i++) Seq[i] = PrimeYs[i+1] - PrimeYs[i]; /* std::cerr << "SubSeq ready" << std::endl; */ Answer(Primes[find_seq_in_seq(Diffs, Seq)] - first_y); /* std::cerr << "Done" << std::endl; */ } } int main() { int t = GetT(); long long n = GetN(); int q = GetQ(); long long c = GetC(); if (t==50) // groups 1,2 solve_by_precomputing_nod(); else if (n==1000000000) // group 3 solve_by_prime_distances(); else // just for example testcase solve_by_precomputing_nod(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include "dzilib.h" #include <vector> /* #include <iostream> */ /* #include "../../simple-console-debug/debug.h" */ int find_seq_in_seq(const std::vector<short>& Main, const std::vector<short>& Sub) { for (int i=0; i<(int)Main.size()-(int)Sub.size()+1; i++) { bool success = true; for (int j=0; j<(int)Sub.size(); j++) if (Main[i+j]!=Sub[j]) { success = false; break; } if (success) { return i; } } throw; } int find_seq_in_seq_with_hint(const std::vector<short>& Main, const std::vector<short>& Sub, const std::vector<int>& Hint) { for (int i : Hint) { bool success = true; for (int j=0; j<(int)Sub.size(); j++) if (Main[i+j]!=Sub[j]) { success = false; break; } if (success) { return i; } } throw; } void solve_by_precomputing_nod() { int t = GetT(); std::vector<short> NOD(1000032, 1); NOD[0] = -1; for (int d=2; d<1000032; d++) for (int w=d; w<1000032; w+=d) NOD[w]++; std::vector<std::vector<int>> Hints(241); for (int i=1; i<=1000000; i++) Hints[NOD[i]].push_back(i); /* std::cerr << "NOD = " << deb::Container(NOD) << std::endl; */ for (int z=0; z<t; z++) { std::vector<short> Seq(32); for (int i=0; i<32; i++) Seq[i] = Ask(i); /* std::cerr << "SEQ = " << deb::Container(Seq) << std::endl; */ Answer(find_seq_in_seq_with_hint(NOD, Seq, Hints[Seq[0]])); } } void solve_by_prime_distances() { int t = GetT(); const int UP = 1000001000; std::vector<bool> Sieve(UP+1); std::vector<short> Diffs; std::vector<int> Primes; int last_prime = 2; Diffs.reserve(51000000); Primes.reserve(51000000); Primes.push_back(2); for (unsigned int i=3; i<=UP; i+=2) if (!Sieve[i]) { Primes.push_back(i); Diffs.push_back(i-last_prime); last_prime=i; for (long long j=(long long)i*i; j<=UP; j+=2*i) Sieve[j] = true; } /* std::cerr << "Primes ready" << std::endl; */ for (int z=0; z<t; z++) { const int RD = 15; // required diffs std::vector<short> PrimeYs; int first_y = -1; for (int y=0; (int)PrimeYs.size() <= RD; y++) if (Ask(y) == 2) { if (first_y == -1) first_y = y; PrimeYs.push_back(y); } /* std::cerr << "SubPrimes ready" << std::endl; */ std::vector<short> Seq(RD); for (int i=0; i<RD; i++) Seq[i] = PrimeYs[i+1] - PrimeYs[i]; /* std::cerr << "SubSeq ready" << std::endl; */ Answer(Primes[find_seq_in_seq(Diffs, Seq)] - first_y); /* std::cerr << "Done" << std::endl; */ } } int main() { int t = GetT(); long long n = GetN(); int q = GetQ(); long long c = GetC(); if (t==50) // groups 1,2 solve_by_precomputing_nod(); else if (n==1000000000) // group 3 solve_by_prime_distances(); else // just for example testcase solve_by_precomputing_nod(); return 0; } |