Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int op(int i, int j){
- return (i + j - 2 * __gcd(i, j));
- }
- bool check(vector<int> v, int limit){
- //calculates sum (i + j - 2gcd(i, j))
- vector<int> k;
- for (int i = 0; i < v.size(); i++){
- if (v[i]) k.push_back(i);
- }
- int ans = 0;
- for (int i = 0; i < k.size(); i++){
- for (int j = i + 1; j < k.size(); j++){
- ans += v[k[i]]*v[k[j]]*op(k[i] + 1, k[j] + 1);
- if (ans > (4*limit - 4)){
- return false;
- }
- }
- }
- for (int i = 0; i < k.size(); i++){
- if (k[i] % 2){
- ans += v[k[i]] * (k[i] - 1);
- }
- else{
- ans += v[k[i]] * (k[i] - 2);
- }
- }
- int val = 0; int r = k.size();
- for (int i = 0; i < min(6, r); i++){
- val += v[i];
- }
- if (val < 10) return false;
- if (ans > (4*limit - 4)){
- return false;
- }
- return true;
- }
- void print(vector<int> v){
- for (int i = 0; i < v.size(); i++){
- if (v[i] != 0){
- printf("%d^^%d ", i+1, v[i]);
- }
- }
- printf("\n");
- }
- void solve(vector<int> v, int limit, int gcdterm, int sum, int no, int paritycounter){
- //no terms can go in which exceed limit
- //limit is equal to N.
- if (sum == limit){
- if (check(v, limit)){
- print(v);
- }
- return;
- }
- int k = v.size() + 1; //all ones, twos, and threes have been added into the set, if k = 4.
- if (k == 7){
- if (no < 10) return;
- }
- if (k > (limit - sum)){ //clearly this isn't going to work, is it?
- return;
- }
- //if q_k = 0...
- vector<int> q(v);
- q.push_back(0);
- solve(q, limit, gcdterm, sum, no, paritycounter);
- for (int q_k = 1; q_k <= (limit - sum)/k; q_k++){
- int tempg = gcdterm;
- int temps = sum;
- int tempn = no;
- int tempp = paritycounter;
- temps += q_k*k;
- tempn += q_k;
- if (k % 2 == 0){
- tempp += (k - 2)*q_k;
- }
- else{
- tempp += (k - 1)*q_k;
- }
- if (((tempn)*(limit - temps))/2 + tempg + tempp > (4*limit-4)) continue;
- for (int i = 0; i < k - 1; i++){
- tempg += v[i]*q_k*op(i + 1, k);
- }
- if (((tempn)*(limit - temps))/2 + tempg + tempp > (4*limit-4)) continue;
- vector<int> q(v);
- q.push_back(q_k);
- solve(q, limit, tempg, temps, tempn, tempp);
- }
- }
- int main(){
- //Possible partitions were Q_k <= 4N - 4
- freopen("answersCi.out", "w", stdout);
- for (int i = 1; i < 300; i++){
- printf("This is the answer for case %d:\n", i);
- cerr << i << endl;
- vector<int> v;
- solve(v, i, 0, 0, 0, 0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement