分类
标签
2-SAT AC自动机 BFS CDQ dfs DP fail树 FFT FFT&NTT FWT hash KD-Tree KMP LCA SPFA STL Tarjan Treap Trie 主席树 乱搞 二分 二分图匹配 二分答案 二维SPFA 交互 位运算 其他 最小生成树 分块 区间DP 半平面交 博弈论 可持久化 可持久化Trie树 后缀数组 图库 平衡树 并查集 插头DP 数学 数论 无旋Treap 日记 暴力 权值树状数组 栈 树DP 树套树 树状数组 树贪心 概率DP 模拟 欧拉定理 点分治 状压DP 生成函数 矩阵乘 线性规划 线段树 组合 网络流 群论 莫比乌斯反演 计算几何 贪心 费用流 高斯消元
724 字
4 分钟
BZOJ3884 上帝与集合的正确用法
Description
根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天,上帝创造了一个世界的基本元素,称做“元”。
第二天,上帝创造了一个新的元素,称作“”。“”被定义为“元”构成的集合。容易发现,一共有两种不同的“”。
第三天,上帝又创造了一个新的元素,称作“”。“”被定义为“”构成的集合。容易发现,一共有四种不同的“”。
第四天,上帝创造了新的元素“”,“”被定义为“”的集合。显然,一共会有种不同的“”。
如果按照这样下去,上帝创造的第四种元素将会有种,第五种元素将会有种。这将会是一个天文数字。
然而,上帝并没有预料到元素种类数的增长是如此的迅速。他想要让世界的元素丰富起来,因此,日复一日,年复一年,他重复地创造着新的元素……
然而不久,当上帝创造出最后一种元素“”时,他发现这世界的元素实在是太多了,以致于世界的容量不足,无法承受。因此在这一天,上帝毁灭了世界。
至今,上帝仍记得那次失败的创世经历,现在他想问问你,他最后一次创造的元素“”一共有多少种?
上帝觉得这个数字可能过于巨大而无法表示出来,因此你只需要回答这个数对取模后的值即可。 你可以认为上帝从“”到“”一共创造了次元素,或次,或者干脆次。
一句话题意: 求
对取模后的值
Input
接下来行,每行一个正整数,代表你需要取模的值
Output
行,每行一个正整数,为答案对取模后的值
Sample Input
3
2
3
6
Sample Output
0
1
4
HINT
对于的数据,,
题解
根据扩展欧拉定理 对于所有的都成立
然后我们就可以做了
已知任何数模等于
递归求解
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
long long pow_mod(long long a, int b, int MOD)
{
long long ans = 1;
while (b)
{
if (b & 1) ans = ans * a % MOD;
b >>= 1;
a = a * a % MOD;
}
return ans;
}
int phi(int x)
{
int ans = x;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
while (x % i == 0) x /= i;
ans = ans - ans / i;
}
}
if (x != 1) ans = ans - ans / x;
return ans;
}
int Calc(int P)
{
if (P == 1) return 0;
int x = phi(P);
return (int)pow_mod(2, Calc(x) + x, P);
}
int main()
{
int T = read();
while (T--)
{
int p = read();
printf ("%d\n", Calc(p));
}
}