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 相信大家都听说一个"百岛湖"的地方吧.百岛湖的居民生活在不同的小岛中.当他们想去其它的小岛时都要通过划小船来实现.如今政府决定大力发展百岛湖 ...
随机推荐
- 4G巴歇尔槽流量采集网关
首先向大家展示下拓扑图: 金鸽科技R10物联网网关,带有一个RS485口可以采集巴歇尔槽的液位状态,还提供一个网口用于给摄像头和现场其他的网络设备提供网络传输通道!R10A内置了巴歇尔槽液位换算成流量 ...
- JS for in / foreach / for of 超简单对照解释
for in 可以遍历数组/对象/字符串/enumerable对象,得到的是索引,遍历对象时可以写这样 obj[index] 代表对象当前的属性foreach 只能遍历数组,不能遍历字符串.对象for ...
- HTML js 复习
<a href="#top" target="_self">返回顶部</a> 返回页面顶部代码 打印js对象方法 function wr ...
- JVM内存模型和结构详解(五大模型图解)
JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的. 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关@mi ...
- OpenSSF的开源软件风险评估工具:Scorecards
对于IT从业者来说,Marc Andreessen 十年前提出"软件吞噬世界"的观点早已耳熟能详.无论是私人生活还是公共领域,软件为现代社会的方方面面提供动力,对现代经济和国家安全 ...
- Docker 09 可视化
参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...
- Nginx 代理Vue项目出现Invalid Host header
说明 使用 Nginx 的 upstream 对 Vue 项目做负载均衡时,代理的地址无法访问目标地址,且页面报错: Invalid Host header(无效主机头) 分析 检查 Nginx 的 ...
- IO流----读取文件,复制文件,追加/插入文件
文件结构 读取文件 第一种方式 public class Test { public static void main(String[] args) throws IOException { // 最 ...
- PerfView专题 (第十二篇):对 C# 下的 SDK 类库进行监控(大结局)
一:背景 本篇是我们系列文章的最后一篇,前面的文章中大多是在 CLR Runtime 以及 OS 层面进行监控来发现各种可疑的程序问题,除了这两个层面,其实我们还可以对 SDK 中一些类进行洞察,比如 ...
- Go 语言入门 3-动态数组(slice)的特性及实现原理
go 语言中的动态数组(slice),是基于数组实现的,可以相比数组而言更加的灵活.其他语言的 slice 通常仅是一个 API, 但是 go 语言的 slice 不仅仅是一种操作, 也是一种数据结构 ...