QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#405841 | #5874. Mystery Square | lzytag | 41 ✓ | 997ms | 3748kb | C++14 | 2.8kb | 2024-05-06 14:40:39 | 2024-05-06 14:40:40 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef __int128 lll;
typedef long long ll;
const lll I = 1;
string str;
int a[130];
int n,m;
bool flag = 0;
void check1(lll x,lll cur)
{
if(flag) return ;
int mid = (1+m)/2;
for(int j = 2;j < mid-1;j++)
{
lll X = cur*cur;
if((X^x) & (I<<(j+1))) cur |= I<<j;
}
cur |= I<<(mid-1);
lll X = cur*cur;
for(int i = 1;i <= m;i++)
{
int b = X>>(i-1)&1;
if((b^a[i]) == 1) return ;
}
for(int i = m;i > 0;i--)
{
int b = X>>(i-1)&1;
cout<<b;
}
for(int i = 1;i <= n-m;i++) cout<<0;
cout<<"\n";
flag = 1;
//exit(0);
}
void check2(lll x)
{
if(flag) return ;
int mid = (1+m)/2;
lll cur = ceil(sqrtl(x));
lll X = cur*cur;
for(int i = 1;i <= m;i++)
{
int b = X>>(i-1)&1;
if((b^a[i]) == 1) return ;
}
for(int i = m;i > 0;i--)
{
int b = X>>(i-1)&1;
cout<<b;
}
for(int i = 1;i <= n-m;i++) cout<<0;
cout<<"\n";flag = 1;
//exit(0);
}
void sou1(int x,lll y)
{
if(x == (m+1)/2+1) return check1(y,1),check1(y,3),void();
if(a[x] != 0 && x != 2) sou1(x+1,y|(I<<(x-1)));
if(a[x] != 1 && x != 1) sou1(x+1,y);
}
void sou2(int x,lll y)
{
if(x == m+1) return check2(y),void();
if(a[x] != 0 && x != 2) sou2(x+1,y|(I<<(x-1)));
if(a[x] != 1 && x != 1) sou2(x+1,y);
}
void work()
{
int mid = (m+1)/2,cnt1 = 0,cnt2 = 0;
for(int i = 1;i <= mid;i++)
if(a[i] == 2) cnt1++;
for(int i = mid+1;i <= m;i++)
if(a[i] == 2) cnt2++;
//cout<<cnt1<<" "<<cnt2<<"\n";
//for(int i = 1;i <= m;i++) cout<<a[i]<<" ";
//cout<<"\n";
if(cnt1 <= cnt2) sou1(1,0);
else sou2(mid+1,0);
}
int TT;
int solve()
{
//system("fc grow1.out grow.out");
//freopen("grow.in","r",stdin);
//freopen("grow.out","w",stdout);
flag = 0;
++TT;cin>>str;n = str.size();
//if(TT < 16) return 0;
cout<<"Case #"<<TT<<": ";
for(int i = 1;i <= n;i+=2)
{
if(str[n-i] == '0') continue;
bool Flag = 0;
for(int j = 1;j < i;j++) if(str[n-j] == '1') Flag = 1;
if(Flag) continue;
m = n-i+1;
for(int j = 1;j <= m;j++)
{
if(str[m-j] == '?') a[j] = 2;
else a[j] = str[m-j]-'0';
}
if(m == 2) continue;
if(m == 1)
{
if(flag) continue;
cout<<1;
for(int j = 1;j < n;j++) cout<<0;
cout<<"\n";flag = 1;
continue;
}
work();
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int T;cin>>T;
while(T--) solve();
return 0;
}
详细
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 1ms
memory: 3748kb
input:
25 1??? 1 10??110??00??1000?? 1??010?0110?1010?0?010?0111011?11100?100010?0??0??1 1??11????00??1?1?0?1??01??110110?11?00100110?00100?0?00 11?1?1???11111?11?1??11110000?00?????00??0?000?000?1 10??000000?0?00000?00000000??0?0000???00??????0000??? 101???11??11000?????1??1?1??10??0?0100011?0001?01011001...
output:
Case #1: 1001 Case #2: 1 Case #3: 1011110110000100001 Case #4: 111010001100101000001010111011011100110001000110001 Case #5: 1101111110000101100101010111011001110010011000010000100 Case #6: 1111111111111111111111111000000000000000000000000001 Case #7: 1000000000000000000000000000000000000000000000000...
result:
ok 25 lines
Subtask #2:
score: 31
Accepted
Test #2:
score: 31
Accepted
time: 997ms
memory: 3496kb
input:
25 1????????????????????111101010000011100110101111000001011111100110000011000101100000010010110100101000???????????????????? 10?11100?000111??11?01010110100??1?100111?001000000??0101?110?0111?011?11?1??00010111?010??100?100??10?010?001001110111110?1 1000100111100100110011010111100001111010?????????...
output:
Case #1: 11100101110101010110111110101000001110011010111100000101111110011000001100010110000001001011010010100001101011000010100001 Case #2: 1011110000001110111001010110100001110011100010000001101010110001111011111110000010111101010100010010101010100100111011111001 Case #3: 1000100111100100110011010...
result:
ok 25 lines
Extra Test:
score: 0
Extra Test Passed