洛谷 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!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...
随机推荐
- jsp中的下载链接
1.下载链接jsp界面(a链接直接链文件可以看出文件在服务器中的路径,用servlet处理的链接则看不出) <%@ page language="java" contentT ...
- Error:Artifact 'xx.war exploded' has invalid extension
环境信息: IDEA 13 , MAVEN, JBOSS 7. 配置信息: 常规配置. 出错信息: Error:Artifact 'xx.war exploded' has invalid ext ...
- 【比赛】NOIP2017 时间复杂度
恶心的模拟题,考场上犯了一堆错误,多组数据清空没清完.数组开小...民间都是50分,结果CCF90.. 考完后随便改改就过了,还好只少了10分,如果真的是50,我估计会疯掉. 因为考场的时候没写好,所 ...
- 聊聊flink的NetworkEnvironmentConfiguration
本文主要研究一下flink的NetworkEnvironmentConfiguration NetworkEnvironmentConfiguration flink-1.7.2/flink-runt ...
- Luogu 3385 负环 | 我有特别的SPFA技巧
这样似乎跑得快: 初始化所有的dis是0,然后枚举每个点作为起点,用DFS更新所有点的dis: 如果更新到一个栈中节点,那么有负环. #include <cstdio> #include ...
- 【BZOJ3105】【CQOI2013】新Nim游戏
Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...
- C++ strcat(template版本)
template<unsigned N, unsigned M> inline std::shared_ptr<char> strcat(const char (&p1 ...
- python基础之函数进阶之函数作为返回值/装饰器
因为装饰器需要用到返回函数的知识,所以在这里将返回函数和装饰器合并讲解. 什么是返回函数? 我们知道,一个函数中return可以返回一个或者多个值,但其实,return不仅可以返回值,还可以返回函数. ...
- ElasticStack系列之十二 & 搜索结果研究
问题 使用 ElasticSearch 做搜索 时,比如用户输入 --> 柠檬,搜出来的结果 --> 柠檬汽水,柠檬味牙膏等在前面,真正想要的水果那个 柠檬 在后面.已经在中文分词中加了 ...
- 科学计算三维可视化---Traits介绍
简介 Traits是开源扩展库,Traits本身与科学计算可视化没有直接关联,但他其实TVTK,Mayavi,TraitsUI基础 安装: pip3 install traits--cp36-cp36 ...