您的位置:首页 > 其它

BZOJ 1408: [Noi2002]Robot

2017-02-20 08:38 323 查看

1408: [Noi2002]Robot

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 545 Solved: 364
[Submit][Status][Discuss]

Description



Input



Output



Sample Input

3

2 1

3 2

5 1

Sample Output

8

6

75

HINT

90号机器人有10个老师,加上它自己共11个。其中政客只有15号;军人有3号和5号;学者有8个,它们的编号分别是:2,6,9,10,18,30,45,90。

Source

[Submit][Status][Discuss]

吓呆我,这是NOI水平?2002年的啊……

发现x的独立数就是phi(x),而x的老师就是x的约数。

因为$\sum_{d|n}{\phi(d)}=n$,所以只需要求出前两个答案就可以得到最后一个。

前两个只和$p_{i}$有关,和其指数$e_{i}$无关,且任意两个p都是互质的,有$\phi(p_{i})*\phi(p_{j})=\phi(p_{i}*p_{j})$。

所以前缀和维护之前的奇数和偶数个p组成的phi的和即可。

#include <cstdio>

const int mxn = 1005;
const int mod = 10000;

template <class T>
__inline void read(T &x)
{
x = 0;
char c = getchar();
while (c < 48)c = getchar();
while (c > 47)x = x*10 + c - 48, c = getchar();
}

inline int pow(int a, int b)
{
int r = 1;

for (; b; b >>= 1, a = a * a % mod)
if (b & 1)r = r * a % mod;

return r;
}

int n;
int m = 1;
int p[mxn];
int e[mxn];
int ans[2];
int sum[2];

signed main(void)
{
read(n);

for (int i = 1; i <= n; ++i)
read(p[i]), read(e[i]);

for (int i = 1; i <= n; ++i)
m = m * pow(p[i], e[i]) % mod;

sum[0] = 1, sum[1] = 0;

for (int i = 1; i <= n; ++i)if (p[i] & 1)
{
--p[i];

int s0 = sum[0];
int s1 = sum[1];

(ans[0] += p[i] * s1) %= mod;
(ans[1] += p[i] * s0) %= mod;

(sum[0] += s1 * p[i]) %= mod;
(sum[1] += s0 * p[i]) %= mod;
}

printf("%d\n%d\n%d\n", ans[0], ans[1], ((m - ans[0] - ans[1] - 1) % mod + mod) % mod);
}


@Author: YouSiki
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: