#include "registers.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
#define puf push_front
#define pof pop_front
#define pub push_back
#define pob pop_back
#define rep(x,s,e) for (auto x=s-(s>e);x!=e-(s>e);s<e?x++:x--)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int B=2000;
int s,n,k,q;
const int ALLFLIP=70;
const int ONE=10;
const int AF=11;
void get_min(int n,int k,int ans){ //put the value in ans
const int ARR=69;
append_move(ARR,0);
vector<bool> c(B,0);
append_store(ans,c);
rep(bit,k,0){
const int ALLBIT=71;
vector<bool> ab(B,0);
rep(x,0,n) ab[x*k+bit]=1;
append_store(ALLBIT,ab);
const int kbit=1,temp=2;
append_move(kbit,ARR);
//append_print(kbit);
int curr=n;
while (curr>1){
int p=(curr)/2;
append_right(temp,kbit,p*k);
append_and(kbit,kbit,temp);
curr=(curr+1)/2;
}
//the bit either contains 0 or 1 now
//append_print(kbit);
vector<bool> v2(B,0);
v2[bit]=1;
append_store(temp,v2);
append_and(kbit,kbit,temp);
append_or(ans,ans,kbit); //add to answer if its 1
if (bit==0) continue;
append_xor(kbit,kbit,temp);
append_add(kbit,kbit,ALLFLIP);
append_not(kbit,kbit);
append_and(kbit,kbit,ALLBIT);
//make sure kbit only activates for the numbers with flippped k-bit
append_and(kbit,kbit,ARR);
int p=1;
int tot=bit;
while (tot){
int tmp=min(p,tot);
append_right(temp,kbit,tmp);
append_or(kbit,kbit,temp);
tot-=tmp;
p*=2;
}
//append_print(kbit);
append_or(ARR,kbit,ARR);
}
}
void construct_instructions(int S, int N, int K, int Q) {
s=S,n=N,k=K,q=Q;
vector<bool> allflip(B,1);
append_store(ALLFLIP,allflip);
vector<bool> v(B,0);
v[0]=1;
append_store(ONE,v);
rep(x,0,k) v[x]=1;
append_store(AF,v);
if (s==0){
const int ans=99;
get_min(n,k,ans);
append_move(0,ans);
}
else{
const int temp1=96,temp2=97,temp3=98,ans=99;
rep(x,0,n){
//need to find a way to fill the minimum value with all 1s
get_min(n,k,temp1);
append_left(temp2,temp1,x*k);
append_or(ans,ans,temp2); //added to value to sorted list
if (x==n-1) continue;
rep(x,0,n){
append_right(temp2,0,x*k);
append_and(temp2,temp2,AF);
append_xor(temp2,temp2,temp1); //this will be 0 if same
//we force all differences into bit 1
for (auto &it:{8,4,2,1}){
append_right(temp3,temp2,it);
append_or(temp2,temp2,temp3);
}
append_and(temp2,temp2,ONE); //equality holds if this bit is 0
append_add(temp2,temp2,AF);
append_and(temp2,temp2,AF);
append_left(temp3,temp2,x*k);
append_or(0,0,temp3);
append_add(temp1,temp1,temp2);
}
}
append_move(0,ans);
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
204 KB |
Wrong answer detected in grader |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
332 KB |
Output is correct |
2 |
Correct |
1 ms |
332 KB |
Output is correct |
3 |
Correct |
1 ms |
332 KB |
Output is correct |
4 |
Correct |
1 ms |
332 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
204 KB |
Wrong answer detected in grader |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
1032 KB |
Output is correct |
2 |
Correct |
3 ms |
780 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
1032 KB |
Output is correct |
2 |
Correct |
3 ms |
780 KB |
Output is correct |
3 |
Incorrect |
1 ms |
628 KB |
Wrong answer detected in grader |
4 |
Halted |
0 ms |
0 KB |
- |