Advertisement
Guest User

Partition Finding

a guest
Sep 14th, 2017
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int op(int i, int j){
  5. return (i + j - 2 * __gcd(i, j));
  6. }
  7.  
  8. bool check(vector<int> v, int limit){
  9. //calculates sum (i + j - 2gcd(i, j))
  10. vector<int> k;
  11. for (int i = 0; i < v.size(); i++){
  12. if (v[i]) k.push_back(i);
  13. }
  14. int ans = 0;
  15.  
  16. for (int i = 0; i < k.size(); i++){
  17. for (int j = i + 1; j < k.size(); j++){
  18. ans += v[k[i]]*v[k[j]]*op(k[i] + 1, k[j] + 1);
  19. if (ans > (4*limit - 4)){
  20. return false;
  21. }
  22. }
  23. }
  24. for (int i = 0; i < k.size(); i++){
  25. if (k[i] % 2){
  26. ans += v[k[i]] * (k[i] - 1);
  27. }
  28. else{
  29. ans += v[k[i]] * (k[i] - 2);
  30. }
  31. }
  32. int val = 0; int r = k.size();
  33. for (int i = 0; i < min(6, r); i++){
  34. val += v[i];
  35. }
  36. if (val < 10) return false;
  37. if (ans > (4*limit - 4)){
  38. return false;
  39. }
  40. return true;
  41. }
  42. void print(vector<int> v){
  43. for (int i = 0; i < v.size(); i++){
  44. if (v[i] != 0){
  45. printf("%d^^%d ", i+1, v[i]);
  46. }
  47. }
  48. printf("\n");
  49. }
  50. void solve(vector<int> v, int limit, int gcdterm, int sum, int no, int paritycounter){
  51. //no terms can go in which exceed limit
  52. //limit is equal to N.
  53. if (sum == limit){
  54. if (check(v, limit)){
  55. print(v);
  56. }
  57. return;
  58. }
  59. int k = v.size() + 1; //all ones, twos, and threes have been added into the set, if k = 4.
  60. if (k == 7){
  61. if (no < 10) return;
  62. }
  63. if (k > (limit - sum)){ //clearly this isn't going to work, is it?
  64. return;
  65. }
  66.  
  67. //if q_k = 0...
  68. vector<int> q(v);
  69. q.push_back(0);
  70. solve(q, limit, gcdterm, sum, no, paritycounter);
  71. for (int q_k = 1; q_k <= (limit - sum)/k; q_k++){
  72. int tempg = gcdterm;
  73. int temps = sum;
  74. int tempn = no;
  75. int tempp = paritycounter;
  76. temps += q_k*k;
  77. tempn += q_k;
  78. if (k % 2 == 0){
  79. tempp += (k - 2)*q_k;
  80. }
  81. else{
  82. tempp += (k - 1)*q_k;
  83. }
  84. if (((tempn)*(limit - temps))/2 + tempg + tempp > (4*limit-4)) continue;
  85. for (int i = 0; i < k - 1; i++){
  86. tempg += v[i]*q_k*op(i + 1, k);
  87. }
  88. if (((tempn)*(limit - temps))/2 + tempg + tempp > (4*limit-4)) continue;
  89. vector<int> q(v);
  90. q.push_back(q_k);
  91. solve(q, limit, tempg, temps, tempn, tempp);
  92. }
  93. }
  94.  
  95. int main(){
  96. //Possible partitions were Q_k <= 4N - 4
  97. freopen("answersCi.out", "w", stdout);
  98. for (int i = 1; i < 300; i++){
  99. printf("This is the answer for case %d:\n", i);
  100. cerr << i << endl;
  101. vector<int> v;
  102. solve(v, i, 0, 0, 0, 0);
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement