T解 湖南师大附中集训 模拟考试1

大家都很强,可与之共勉

今天考了试,天哪什么叫差距。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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值