洛谷 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!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
随机推荐
- UFLDL学习笔记 ---- 主成分分析与白化
主成分分析(PCA)是用来提升无监督特征学习速度的数据降维算法.看过下文大致可以知道,PCA本质是对角化协方差矩阵,目的是让维度之间的相关性最小(降噪),保留下来的维度能量最大(去冗余),PCA在图像 ...
- BZOJ1150:[APIO/CTSC2007]数据备份——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1150 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的 ...
- 【BZOJ2654】tree
Time Limit: 30 Sec Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树 ...
- WinForm查询大数据界面假死,使用异步调用解决
用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...
- Android Studio自动生成UML关系类图
android studio 根据源码自动生成UML的插件介绍http://www.jianshu.com/p/cbccd831cf01 simpleumlhttps://plugins.jetbra ...
- [CQOI2012] 交换棋子 (费用流)
$pdf\space solution$ link #include<iostream> #include<cstring> #include<cstdio> ...
- composer install 出现的问题
今天克隆代码之后,在composer install 的时候出现了一些问题,在此记录一下. 错误代码如下: [root@localhost MarketingCenter]# composer ins ...
- 时间序列HW
https://www.cnblogs.com/sylvanas2012/p/4328861.html写得特别好,推荐阅读 Holt-Winters: 三阶指数平滑 Holt-Winters的思想是 ...
- 使用 python 将 "\r\n" 转换为 "\n"
众所周知, Linux 下没有 "\r\n", 而 windows 下文本工具默认打开文件时使用 t 模式, 使得写入一行结尾的换行符为 "\r\n", 这样造 ...
- STM32 ------ HardFault_Hander 中断函数
1.数组越界(对数组赋值) 正常情况,数组越界会进入 HardFault_Hander 中断函数的无线循环. 避免数组越界的一个方法是:每次使用数组前,检查要放入数据的数据长度是否大于数组长度,大于则 ...