Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <algorithm>
- #include <string>
- #include <stack>
- #include <set>
- #include <map>
- #define pii pair <int,int>
- using namespace std;
- using ll = long long;
- using ld = long double;
- /*
- Перебор:
- варианты, на каких осях меняем координаты (2^d)
- 
- Варианты, чему равен r (очевидно, что r ограничен самой короткой осью – может, это можно как-то применить?)
- 
- Варианты, на каких осях (+r), а на каких (-r).
- */
- void cv(vector <int> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n\n";
- }
- ll d;
- string two(int x, int sz){
- string r = "";
- while (x > 0){
- r += ((x % 2) + 48);
- x /= 2;
- }
- reverse(r.begin(), r.end());
- while (r.size() < sz){
- r = '0' + r;
- }
- return r;
- }
- vector <int> idx, now_axe;
- vector <int> axe;
- vector <int> qn; //queen
- vector <int> deep_axe;
- ll ans;
- ll inf = 998244353;
- bool gd(){
- bool r = 1;
- for (int i = 0;i <idx.size();++i){
- if (! (deep_axe[i] > 0 && deep_axe[i] <= axe[idx[i]] ) ){
- r = 0;
- break;
- }
- }
- return r;
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin>>d;
- axe.resize(d); for (auto &x: axe) cin>>x;
- qn.resize(d); for (auto &x: qn) cin>>x;
- string ch_axe;
- for (int msk = 1; msk < (1 << d) ;++msk ){
- ch_axe = two(msk, d);
- idx.clear();
- now_axe.clear();
- for (int i = 0; i < d;++i){
- if (ch_axe[i] == '1'){
- idx.push_back(i);
- now_axe.push_back(axe[i]);
- }
- }
- //до куда двигаем r?
- int till = *min_element(now_axe.begin(), now_axe.end());
- //cout<<"till = "<<till<<"\n";
- deep_axe.resize(idx.size());
- string ch_r_s;
- for (int ch_r = 0; ch_r < (1 << idx.size()); ++ch_r){
- //cout<<two(ch_r, idx.size())<<"\n";
- ch_r_s = two(ch_r, idx.size());
- for (int r = 1; r < till; ++r){
- for (int i = 0; i < idx.size();++i){
- if (ch_r_s[i] == '1'){
- deep_axe[i] = qn[idx[i]] + r;
- }
- else{
- deep_axe[i] = qn[idx[i]] - r;
- }
- }
- if (!gd()) continue;
- //cout<<ch_axe<<' '<<r<<"\n";
- //cout<<ch_r_s<<'\n';
- //ch_r_s обозначает прибавляем мы или отнимаем от координат ферзя число r по осям, которые отмечены 1 d строке ch_axe
- int cnt = 0;
- for (int i = 0; i < ch_axe.size();++i){
- if (ch_axe[i] == '0'){
- cout<<qn[i]<<' ';
- }
- else{
- if (ch_r_s[cnt] == '1'){
- cout<<qn[i] + r<<' ';
- }else{
- cout<<qn[i] - r<<' ';
- }
- cnt++;
- }
- }
- cout<<"\n\n";
- ans++;
- ans %= inf;
- }
- }
- }
- cout<<ans<<"\n";
- }
- /*
- 4
- 2 3 4 5
- 2 1 3 4
- 3
- 8 8 8
- 3 7 5
- 3
- 5 10 7
- 4 2 3
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement