2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different
2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different
比赛时队友开摆,还剩半个小时,怎么办??
当然是一起摆
Solution
看到这个题没多少时间了,没时间细想了,\(\text{DP}\)貌似不可行,一看这个东西就很置换群,火速上\(\text{Burnside}\)引理搞一波,虽然比赛结束也没推完就是了
题意就是问你有多少个本质不同的自然数序列\(a_1,a_2,...,a_n\),其中\(0 \le a_i \le m\),本质相同当且仅当能通过若干次全部模\(m\)意义下\(+1\)和整体循环左移得到。
考虑左移\(i\)位,全部加了\(j\),先考虑旋转,有经典结论,形成了\(\gcd(n,i)\)个循环置换,其中每个循环的长度为\(\frac{n}{\gcd(n,i)}\),然后我们对着这个\(\gcd(n,i)\)一顿操作,希望能够找到一个小环的不动点个数然后乘起来就行了。
自己画个图感受一下,可以发现一个小环的不动点个数有点复杂但比较简单,考虑最小的\(k\)使得\(kj \equiv 0\pmod m\),很容易发现
\]
那么当且仅当\(\frac{m}{\gcd(m,j)} | \frac{n}{\gcd(n,i)}\)有贡献\(m^{\gcd(n,i)}\)
所以可以写出不动点总个数的式子
& \sum_{i=1}^n \sum_{j = 1}^m [\frac{m}{\gcd(m,j)} | \frac{n}{\gcd(n,i)}] m ^ {\gcd(n,i)} \\
&= \sum_{i | n} m ^ i \varphi(\frac{n}{i}) \sum_{j | m} \varphi(\frac{m}{j}) [\frac{m}{j} | \frac{n}{i}]\\
&=\sum_{i | n} m^i \varphi(\frac{n}{i}) \sum_{j | \gcd(m,\frac{n}{i})}\varphi(j)\\
&=\sum_{i | n} m^i \varphi(\frac{n}{i}) \gcd(m,\frac{n}{i})
\end{aligned}
\]
这东西就好做了,直接一个调和级数\(O(n\log n)\)带走
点我看代码o( ̄▽ ̄)d
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
if(f) x = ~x + 1;
}
const LL P = 998244353;
const int U = 1e6;
int T;
const int N = 1e6 + 10;
LL ans, n, m, f[N];
LL p[N], vis[N], tot, phi[N], inv[N];
LL invn, g[N], pw[N];
void Sieve() {
phi[1] = 1;
for(int i = 2; i <= U; ++i) {
if(!vis[i]) p[++tot] = i, phi[i] = i - 1;
for(int j = 1; j <= tot; ++j) {
int v = p[j] * i;
if(v > U) break;
vis[v] = 1;
if(i % p[j] == 0) {
phi[v] = phi[i] * p[j];
break;
}
phi[v] = phi[i] * phi[p[j]];
}
}
}
LL gcd(LL x, LL y) {return y == 0 ? x : gcd(y, x % y);}
LL fpow(LL x, LL pnt = P - 2) {
LL res = 1;
for(; pnt; pnt >>= 1, x = x * x % P) if(pnt & 1) res = res * x % P;
return res;
}
int main() {
read(T);
Sieve();
while(T--) {
ans = 0;
read(n), read(m);
for(int i = 1; i <= n; ++i) inv[i] = fpow(i);
for(int i = 1; i <= n; ++i) f[i] = 0;
pw[0] = 1; for(int i = 1; i <= n; ++i) g[i] = gcd(m, i), pw[i] = pw[i - 1] * m % P;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j * i <= n; ++j) {
f[i * j] = (f[i * j] + phi[j] * pw[i - 1] % P * g[j] % P * inv[i * j] % P) % P;
}
}
for(int i = 1; i < n; ++i) printf("%lld ",f[i]);
printf("%lld\n",f[n]);
}
}
2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different的更多相关文章
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)
前言 依旧是白嫖账号,只打了一些题/kk 正题 1002 Buying Snacks 题目大意 \(n\)个物品,每个可以买一次也可以不买,如果买需要选择\(1/2\)块钱的,然后也可以相邻两个一起买 ...
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解
前言 找大佬嫖到个号来划水打比赛了,有的题没写或者不是我写的就不放了. 目前只有:1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/con ...
- 3I工作室的成员在2013年(第6届)中国大学生计算机设计大赛总决赛中荣获全国二等奖
在暑假举行的2013年(第6届)中国大学生计算机设计大赛中,我院的参赛作品<毕业生论文选导系统>(作者:祝丽艳/许明涛:指导老师:元昌安/彭昱忠)入围总决赛,并荣获全国二等奖. 2013年 ...
- 一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】
pid=2066">http://acm.hdu.edu.cn/showproblem.php? pid=2066 Problem Description 尽管草儿是个路痴(就是在杭电 ...
- 畅通project续HDU杭电1874【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多 ...
- "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场
Combine String #include<cstdio> #include<cstring> #include<iostream> #include<a ...
- hdu_5705_Clock("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5705 题意:给你一个时间和一个角度,问你下一个时针和分针形成给出的角度是什么时候 题解:我们可以将这个 ...
- hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...
- 畅通project再续 HDU杭电1875 【Kruscal算法 || Prim】
Problem Description 相信大家都听说一个"百岛湖"的地方吧.百岛湖的居民生活在不同的小岛中.当他们想去其它的小岛时都要通过划小船来实现.如今政府决定大力发展百岛湖 ...
随机推荐
- MySQL查询时间常用函数
查看本月数据 SELECT *FROMcontent_publishWHERE date_format(publish_time, '%Y %m') = date_format(DATE_SUB(cu ...
- 日志(logging模块)
1. 为什么要使用日志(作用) 在学习过程中,写一个小程序或小demo时,遇到程序出错时,我们一般会将一些信息打印到控制台进行查看,方便排查错误.这种方法在较小的程序中很实用,但是当你的程序变大,或是 ...
- 日均 6000+ 实例,TB 级数据流量,Apache DolphinScheduler 如何做联通医疗大数据平台的“顶梁柱”?
作者 | 胡泽康 鄞乐炜 作者简介 胡泽康 联通(广东)产业互联网公司 大数据工程师,专注于开源大数据领域,从事大数据平台研发工作 鄞乐炜 联通(广东)产业互联网公司 大数据工程师,主要从事大数据平 ...
- Luogu3850 [TJOI2007]书架 (平衡树)
将要插入位置前和前前splay,再连在右子树上. #include <iostream> #include <cstdio> #include <cstring> ...
- Luogu2801 教主的魔法 (分块)
与hzw的分块2类似,放vector排序 #include <iostream> #include <cstdio> #include <cstring> #inc ...
- SpringBoot Excel导入导出
一.引入pom.xml依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- 【java】学习路径29-异常捕捉实例
import java.util.ArrayList;public class ExceptionCatchDemo { public static void main(String[] args) ...
- 通过宏封装实现std::format编译期检查参数数量是否一致
背景 std::format在传参数量少于格式串所需参数数量时,会抛出异常.而在大部分的应用场景下,参数数量不一致提供编译报错更加合适,可以促进我们更早发现问题并进行改正. 最终效果 // 测试输出接 ...
- 关于使用docker volume挂载的注意事项
Content 在用Docker进行持久化的存储的时候,有两种方式: 使用数据卷(volume) -v 容器绝对路径 或者 -v 已经创建的volume名称:容器绝对路径 2. 使用挂载点(共享宿主目 ...
- Java第一篇:为什么是接口?
好家伙, 写了一道Java作业: 一道简单的接口练习题 而答案也比较简单 public class Demo1 { public static void main(String[] args ...