题目链接:点击打开链接
以第一次生成的16位二进制码为基准,根据抽屉原理,只需检验C次,发生变化则为“?”否则为第一次生成的该位置的二进制数
第一位未初始化wa了一次
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long A,B,C,S;
int a[20];
bool c[20];
void init(int n){
int i=0;
while(n>0){
i++;
if(n&1)
a[i]=1;
else
a[i]=0;
n=n>>1;
}
for(int j=i+1;j<=16;j++)
a[j]=0;
}
void check(int n){
int i=0;
int t;
while(n>0){
i++;
if(n&1)
t=1;
else
t=0;
if(t!=a[i])
c[i]=1;
n=n>>1;
}
for(int j=i+1;j<=16;j++)
if(a[j]!=0)
c[j]=1;
}
int main()
{
long long cur;
scanf("%I64d",&A);
while(A!=0){
memset(c,0,sizeof(c));
scanf("%I64d%I64d%I64d",&B,&C,&S);
init(S);
for(int i=1;i<=C;i++){
cur=(((A%C)*(S%C))%C+B%C)%C;
if(S==cur)
break;
else
S=cur;
check(S);
}
for(int i=16;i>=1;i--){
if(c[i])
printf("?");
else
printf("%d",a[i]);
}
printf("\n");
scanf("%I64d",&A);
}
return 0;
}