大家都很强,可与之共勉
今天考了试,天哪什么叫差距。300分满分25分,不过最高的是175,CDQZ最高的是75。
然而毕克毕姥爷,%%%,OrzOrz,随手一讲就是POJ最难的状压Dp。
下面我们来赏析一下第一题
B 君的教育 (Erziehung)
【题目描述】
B 君最近听说了一个很惊人的性质,设 p = −1+i,对于每个高斯整数n
x + yi,我们都可以找到一个非负整数集合 S 满足
∑ p ^ k = n
k∈S
而你需要做的,就是在输入 x 和 y 的情况下,输出集合 S。
如果你看不懂上面的题目,我们形式化的给出如下定义。
就是对于一个复数 (Complex Number),如果他的实部和虚部都是整
数,我们称之为高斯整数。
S 集合中不能有同样的元素,每个元素必须是非负整数。
【输入格式】
一行两个整数 x,y。
【输出格式】
每行一个整数,从小到大输出,表示集合 S。
反正看完就懵B
woc,这是什么,复数?
额,也就得了25分。
正解如下:
n必定为p的倍数,所以他可以唯一分解。
那么分解到1的时候,即为P^0,则找到一个解。记录即可,正解不过几行,全场几个人过。
#include "cstdio"
#include "complex"
using namespace std;
typedef long long LL;
bool a[201];
LL x, y, c;
complex <LL> n, p, u;
struct io {
#define NAME "erziehung"
io() {
freopen(NAME ".in", "r", stdin);
freopen(NAME ".out", "w", stdout);
}
~io() {
fclose(stdin);
fclose(stdout);
}
} WhiteBunny;
int main() {
scanf("%lld%lld", &x, &y);
n = complex<LL>(x, y), p = complex<LL>(-1, 1);
while( n != complex<LL>(0, 0) ) {
u = n / p;
if(u * p != n)
n -= complex<LL>(1, 0), a[c] = true;
n /= p, ++c;
}
for(register int i = 0; i < c; ++i)
if(a[i])
printf("%d\n", i);
return 0;
}