题意简述:有一个性质是设
p=−1+i
,对于每个高斯整数
x+yi
,我们都可以找到一个非负整数集合
S
满足
对于一个复数(Complex Number),如果它的实部和虚部都是整数,我们称之为高斯整数。
很多大佬们都想到了可以做类似二进制拆分,就用了短除法,复杂度
#include<bits/stdc++.h>
typedef long long ll;
ll x,y;
namespace subtask3{
const int N = 126;
struct CN{
ll r, i;
CN(){}
CN(ll _r, ll _i):
r(_r),i(_i){}
}p[N];
CN operator * (const CN &a, const CN &b) {
return CN(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}
ll sx[N], _sx[N], sy[N], _sy[N];
int a[N + 1];
bool find;
void dfs(int dep, ll x, ll y) {
if (dep < 0) {
if (!x && !y) {
find = 1;
for (int i=a[0]; i > 0; i--)
printf("%d\n",a[i]);
}
return;
}
if (find || x + sx[dep] < 0 || x + _sx[dep] > 0
|| y + sy[dep] < 0 || y + _sy[dep] > 0) {
//printf("find=%d dep=%d x=%lld y=%lld\n", find, dep, x, y);
return;
}
dfs(dep - 1, x, y);
a[++a[0]] = dep;
dfs(dep - 1, x + p[dep].r, y + p[dep].i);
a[0]--;
}
int main(){
p[0] = CN(1,0);
sx[0] = 1, _sx[0] = 0;
sy[0] = 0, _sy[0] = 0;
for (int i=1; i<N; i++) {
p[i] = p[i - 1] * CN(-1, 1);
sx[i] = sx[i - 1], _sx[i] = _sx[i - 1];
sy[i] = sy[i - 1], _sy[i] = _sy[i - 1];
if (p[i].r > 0)
sx[i] += p[i].r;
else
_sx[i] += p[i].r;
if (p[i].i > 0)
sy[i] += p[i].i;
else
_sy[i] += p[i].i;
}
dfs(N - 1, -x, -y);
return 0;
}
}
int main(){
scanf("%lld%lld",&x,&y);
subtask3::main();
return 0;
}