Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <cstring>
- #include <deque>
- #include <stack>
- #include <stdio.h>
- #include <map>
- #include <set>
- #include <time.h>
- #include <string>
- #include <fstream>
- #include <queue>
- #include <bitset>
- #include <cstdlib>
- #define X first
- #define Y second
- #define mp make_pair
- #define pb push_back
- #define pdd pair<double,double>
- #define pii pair<ll,ll>
- #define PI 3.14159265358979323846
- #define MOD 1000000007
- #define MOD2 1000000009
- #define INF ((ll)1e+18)
- #define x1 fldgjdflgjhrthrl
- #define x2 fldgjdflgrtyrtyjl
- #define y1 fldggfhfghjdflgjl
- #define y2 ffgfldgjdflgjl
- #define N 200002
- #define SUM 23423
- #define MAG 1048576
- #define OPEN 0
- #define CLOSE 1
- typedef int ll;
- typedef long double ld;
- using namespace std;
- ll i,j,n,k,l,m,tot, flag,h,r, K,x1,y1,x2,y2,x3,y3,mmx,mmy,x,y,z,ysz;
- ll arr[55], b[55];
- vector<ll> f;
- ll ans[250][250], dp[52][202][2002];
- struct HashSet2
- {
- ll a[2500];
- ll getHash(long long x)
- {
- return (x&2048);
- }
- void Set(ll x)
- {
- ll y = getHash(x);
- while (a[y] != -1)
- y++;
- a[y] = x;
- }
- bool Get(ll x)
- {
- ll y = getHash(x);
- while (a[y] != -1 && a[y] != x)
- y++;
- return (a[y] == x);
- }
- } t2;
- long long getMyMagic(ll x, ll y, ll z, ll w)
- {
- return 1LL*x*270000000+y*900000+z*300+w;
- }
- ll getMyMagic2(ll n, ll m, ll k)
- {
- return n*6000000 + m*2500 + k;
- }
- bool check(ll l)
- {
- int n = f[l]/6000000;
- if (ans[l][0] == -1)
- return true;
- for (int i = 0; i < n; i++)
- if (ans[l][i] > arr[i])
- {
- return true;
- } else
- if (ans[l][i] < arr[i])
- return false;
- return true;
- }
- void go(ll j, ll k)
- {
- //cout << i << " " << j << " " << k << endl;
- if (i == n)
- {
- ll ccur = getMyMagic2(i,j,k);
- if (t2.Get(ccur))
- {
- ll cur_pos;
- for (int l = 0; l < f.size(); l++)
- if (f[l] == ccur)
- cur_pos = l;
- bool flag = check(cur_pos);
- if (flag)
- {
- for (int l = 0; l < f.size(); l++)
- if (f[l] == ccur)
- {
- int nn = f[l]/6000000;
- for (int r = 0; r < nn; r++)
- ans[l][r] = arr[r];
- }
- }
- }
- return;
- }
- for (int l = 0;; l++)
- {
- int xx = k+(n-i)*i*l, yy = j+l*(n-i);
- if (xx > 2000 || yy > 200)
- break;
- if (dp[i+1][yy][xx] != n)
- {
- dp[i+1][yy][xx] = n;
- arr[i] = l;
- i++;
- go(yy, xx);
- i--;
- }
- }
- }
- int main() {
- //1 3 6 10 2+3+4+5+7+9 //1 3 6 10 15 2+3+4+5 5+7+9 3
- //freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- for (i = 0; i < 2500; i++)
- t2.a[i] = -1;
- ll tests;
- cin >> tests;
- while (tests--)
- {
- cin >> n >> m >> k;
- b[n] = 1;
- x = getMyMagic2(n,m,k);
- f.push_back(x);
- t2.Set(x);
- }
- for (i = 0; i < f.size(); i++)
- ans[i][0] = -1;
- for (n = 1; n <= 50; n++)
- if (b[n])
- {
- i=0;
- go(0,0);
- }
- for (int i = 0; i < f.size(); i++)
- {
- ll cur = f[i]/6000000;
- if (ans[i][0] == -1)
- cout << -1 << endl;
- else
- {
- for (j = 0; j < cur; j++)
- {
- if (j)
- ans[i][j] += ans[i][j-1];
- cout << ans[i][j] << " ";
- }
- cout << endl;
- }
- }
- /*for (i = 0; i < 50; i++)
- for (j = 0; j <= 200; j++)
- for (k = 0; k <= 2000; k++)
- if (dp[i][j][k] != -1)
- {
- //if (i <= 3 && j <= 3 && k <= 5)
- //cout << i << " " << j << " " << k << " " << dp[i][j][k] << endl;
- ll cur_dp = dp[i][j][k];
- ll cur_sum = sum[i][j][k];
- for (l = cur_dp; k + l*i-cur_sum <= 2000 && l <= 200-j; l++)
- {
- if (dp[i+1][j+l][k+l*i-cur_sum] > l || dp[i+1][j+l][k+l*i-cur_sum] == -1)
- {
- dp[i+1][j+l][k+l*i-cur_sum] = l;
- lk[i+1][j+l][k+l*i-cur_sum] = k;
- sum[i+1][j+l][k+l*i-cur_sum] = cur_sum+l;
- }
- }
- }*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement