洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307。这题在bzoj上是权限题。
题意简述:
这题分为两个部分:
① 有一些珠子,每个珠子可以看成一个无序三元组。三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠子不同当且仅当这个三元组不同。计算有多少种不同的珠子。
② 把这些珠子串成一个环,要满足相邻的珠子不同。两个环不同当且仅当旋转任意角度后仍然不同。计算有多少种不同的环。
题解:
分成两部分做。
第一部分:
考虑计算三元组的个数,转无序为有序,再去重。
答案=(三个都不同的有序三元组方案)/6+(两个相同,另一个不同的方案)/3+(三个都相同的方案)。
容斥一下得到答案=(三元组的方案+二元组的方案*3+一元组的方案*2)/6。
因为一元组只有(1)满足条件,所以答案是(2+三元组的方案+二元组的方案*3)/6。
考虑如何求出两种方案。
三元组的方案是\(\sum_{i=1}^m\sum_{j=1}^m\sum_{k=1}^m[\gcd(i,j,k)=1]\),二元组同理。
显然是莫反套路,三元组的答案是\(\sum_{d=1}^m\mu(d){\left\lfloor\frac{m}{d}\right\rfloor}^3\),二元组同理。
数论分块求出答案即可,最后乘上6的逆元。这一步复杂度$\Theta(m+T\sqrt{m})$。
第二部分:
知道了不同珠子的数量,要求出本质不同的环的个数。
Burnside引理套路。最终方案数等于每个置换的不动点个数的平均数,即\(\frac{1}{n}\sum_{i=1}^nf(i)\),\(f(i)\)表示旋转\(i\)格的不动点数量。
稍微化简一下:\(\frac{1}{n}\sum_{d|n}\varphi(\frac{n}{d})f(d)\)。
考虑计算\(f(x)\),当$x$是$n$的因数时,$f(x)$就等于不考虑旋转时的长度为$x$的环的数量。
假设不同珠子的数量为\(k\),不加证明地给出一个式子:\(f(x)=(k-1)^x+(-1)^x(k-1)\)。这个式子可以递推得出。
那么根据这个式子和上面的式子计算即可。
要注意\(n\)太大了,要求出\(\varphi\)的值比较困难,考虑DFS它的每个质因数,按照\(\varphi\)是个积性函数以及公式,求得\(\varphi\)。
要注意,最后除掉\(n\)的时候,\(n\)可能是模数的倍数导致没有逆元。可以发现\(n\)不会是模数平方的倍数,所以把模数平方后再做一遍,最后除掉模数这个因子即可。
#include <cstdio> #define reg register
typedef unsigned long long ULL;
const ULL MOD = 1000000007ll;
const ULL Inv61 = 166666668ll;
const ULL Inv62 = 833333345000000041ll;
ULL Mod;
ULL Inv6;
const int MN = ; ULL TN[];
int TA[], MA; bool ip[MN];
int p[MN], pc;
int mu[MN];
inline void SieveInit() {
ip[] = ip[] = ;
mu[] = ;
for (reg int i = ; i <= MA; ++i) {
if (!ip[i])
p[++pc] = i,
mu[i] = -;
for (reg int j = ; j <= pc; ++j) {
reg int k = p[j] * i;
if (k > MA) break;
ip[k] = ;
if (i % p[j]) mu[k] = -mu[i];
else break;
}
}
for (reg int i = ; i <= MA; ++i)
mu[i] += mu[i - ];
} int O;
inline ULL Mul(ULL x, ULL y) {
if (!O) return x * y % Mod;
return (x * y - (ULL)((long double) x / Mod * y) * Mod + Mod) % Mod;
} ULL N; int A;
ULL M;
inline void SolveM() {
M = ;
for (reg int i = , j, k; i <= A; i = j + ) {
k = A / i, j = A / k;
M = (M + Mul(Mul(Mul(k, k), k + ), (mu[j] - mu[i - ] + Mod) % Mod)) % Mod;
}
M = Mul(M, Inv6);
} ULL Pow[];
inline void PowInit() {
Pow[] = M - ;
for (reg int i = ; i < ; ++i) Pow[i] = Mul(Pow[i - ], Pow[i - ]);
}
inline ULL qPow(ULL E) {
ULL A = ;
for (reg int j = ; E; E >>= , ++j)
if (E & ) A = Mul(A, Pow[j]);
return A;
}
inline ULL Inv(ULL B) {
ULL A = ;
for (reg ULL E = MOD - ; E; E >>= , B = B * B % MOD)
if (E & ) A = A * B % MOD;
return A;
} ULL b[]; int e[], cnt;
ULL Ans;
inline ULL F(ULL x) {
return (qPow(x) + (x & ? Mod - M + : M - )) % Mod;
}
void DFS(int st, ULL now, ULL phi) {
if (st > cnt) {
Ans = (Ans + Mul(phi % Mod, F(N / now))) % Mod;
return;
}
DFS(st + , now, phi);
for (reg int i = ; i <= e[st]; ++i) {
now *= b[st];
phi *= i == ? b[st] - : b[st];
DFS(st + , now, phi);
}
}
inline ULL Solve() {
ULL NN = N; cnt = ;
for (reg ULL i = ; i * i <= NN; ++i) if (NN % i == ) {
b[++cnt] = i, e[cnt] = ;
while (NN % i == ) NN /= i, ++e[cnt];
} if (NN > ) b[++cnt] = NN, e[cnt] = ;
Ans = ; DFS(, , );
if (O) Ans = Ans / MOD * Inv(N / MOD) % MOD;
else Ans = Ans * Inv(N % MOD) % MOD;
return Ans;
} int main() {
int Tests;
scanf("%d", &Tests);
for (int i = ; i <= Tests; ++i)
scanf("%llu%d", TN + i, TA + i),
MA = TA[i] > MA ? TA[i] : MA;
SieveInit();
for (int i = ; i <= Tests; ++i) {
N = TN[i], A = TA[i];
O = N % MOD ? : ;
if (O) Mod = MOD * MOD, Inv6 = Inv62;
else Mod = MOD, Inv6 = Inv61;
SolveM();
PowInit();
printf("%llu\n", Solve());
}
return ;
} // 1. 求出本质不同的珠子数量,容斥 + 莫比乌斯反演 + 数论分块
// 2. 求出答案,Burnside 引理 + 数论分块
洛谷 P3307: bzoj 3202: [SDOI2013] 项链的更多相关文章
- bzoj 3202: [Sdoi2013]项链
Description 项链是人体的装饰品之一,是最早出现的首饰.项链除了具有装饰功能之外,有些项 链还具有特殊显示作用,如天主教徒的十字架链和佛教徒的念珠. 从古至今人们为了美化人体本身,也美 化环 ...
- bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...
- 洛谷 P2056 BZOJ 2743 [HEOI2012]采花
//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
- 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT
题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...
- 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询
题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...
- 洛谷 P2486 BZOJ 2243 [SDOI2011]染色
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...
- 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓
题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...
- 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑
题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
随机推荐
- NIO - 三大组件
NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pi ...
- 【HDU4336】Card Collector(Min-Max容斥)
[HDU4336]Card Collector(Min-Max容斥) 题面 Vjudge 题解 原来似乎写过一种状压的做法,然后空间复杂度很不优秀. 今天来补一种神奇的方法. 给定集合\(S\),设\ ...
- 【IOI 2018】Doll 机械娃娃
我感觉这个题作为Day2T1,有一定的挑战性.为$Rxd$没有完成这道题可惜. 我觉得这道题,如果按照前几个部分分的思路来想,就有可能绕进错误的思路中.因为比如说每个传感器最多只在序列中出现$2$次, ...
- 【模板】exBSGS/Spoj3105 Mod
[模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...
- response.sendRedirect()和request.getRequestDispatcher().forward(request,response)的区别
转发方式:request.getRequestDispatcher().forward(); 重定向方式:response.sendRedirect(); 下面是HttpServletRespons ...
- Button 或 ImageButton 背景设为 透明 或半透明 (转)
半透明<Button android:background="#e0000000" ... /> 透明<Button android:background=&qu ...
- 解题:SCOI 2005 骑士精神
题面 我把这个当做IDA*的模板题的说,说说我个人对IDA*的理解 IDA*是一个DFS,和A*一样,它也有一个乐观的估价函数.这里这个估价函数是用来限制状态的扩展的,如果当前代价加上乐观的估计都无法 ...
- ab输出信息解释以及Failed requests原因分析
ab是apache自带的压力测试工具.ab进行的一切测试本质上是基于HTTP的.下面是对ab输出项信息的解释和出现Failed requests原因分析.测试实例:1. ab输出信息说明: 1 2 ...
- python print end=' ' 不换行
python3.x 实现print 不换行 python中print之后是默认换行的,是因为其默认属性 end 默认值为"\n"(\n为换行符). 做练习99乘法表时不想换行,改变 ...
- ssh 执行命令并实时显示结果
ssh 执行命令并实时显示结果 import paramiko def main(): sshClient = paramiko.SSHClient() sshClient.set_missing_h ...