九校联考(DL24凉心模拟) 整除(中国剩余定理+原根性质)
题意简述
给定 \(n, m\),求 \(n|x^m - x\) 在满足 \(x \in [1, n]\) 时合法的 \(x\) 的数量。答案模 \(998244353\)。单个测试点包含多组数据。
其中 \(n\) 由如下方式给出:
- 给定 \(c\) 个不超过 \(t\) 的质数 \(p_i(i \in [1, c])\),有 \(n = \prod_\limits{i = 1}^c p_i\)。
所有测试数据满足 \(1 \leq c \leq 50,1 \leq t \leq 10^4,1 \leq m \leq 10^9\),数据组数 \(\leq 10000\)。
题解
首先,由于已经给出了 \(n\) 的唯一分解式 \(n = p_1p_2\cdots p_c\),故我们可以将 \(n | x^m - x\) 这个式子拆成由 \(c\) 个形如 \(x^m \equiv x\ ({\rm mod}\ p_i)\) 的同余方程组成的同余方程组。
我们先对第 \(i\) 个方程求出 \([1, p_i]\) 内满足条件的数的数量,记为 \(s_i\)。显然这些解 \({\rm mod}\ p_i\) 均不相同,故 \(s_i\) 即 \(x\) 在 \({\rm mod}\ p_i\) 意义下的合法余数的数量。由于所有 \(p_i\) 均为互不相同的质数,即两两互质,因此可以证明,除了 \(1\) 为公共解外,任意两个方程的解(\([1, p_i]\) 范围内)不存在交集。因此,我们在每个方程中任选一个解,构造一个新的一次同余方程组,共能得到 \(\prod s_i\) 个不同的方程组。由于根据中国剩余定理,每个方程组在 \([1, n]\) 范围内仅有唯一解,因此答案就为 \(\prod s_i\)。
所以,对于第 \(i\) 个方程,我们需要求 \(s_i = \sum_\limits{x = 1}^p[x ^ m \equiv x{\ \rm mod\ }p]\)。
存在一种做法是使用线性筛在接近线性的时间内求所有 \([1, p_i]\) 内的数的 \(m\) 次幂,然后暴力判断。不过这里,介绍一种更简单的方法。
首先给出以下结论:给定 \(m\) 和 \(p\),且 \(p\) 为质数,那么有:
\]
证明如下:
我们要求满足 \(x \in [1, p]\) 时 \(x^m \equiv x\ ({\rm mod}\ p)\) 的 \(x\) 的个数。
首先 \(x = p\) 一定满足,故不特殊考虑,最后答案 \(+1\) 即可。接下来只考虑 \(x \in [1, p - 1]\) 的情况。由于 \(p\) 为质数,因此 \(p\) 存在一个原根 \(g\),\([1, p - 1]\) 内的任意数在 \({\rm mod}\ p\) 意义下都可以表示为 \(g^y\) 的形式。这样,原方程就转化为:
\[g^{my} \equiv g^y\ ({\rm mod}\ p)
\]根据费马小定理:
\[my \equiv y\ ({\rm mod}\ p - 1) \Rightarrow (m - 1)y \equiv 0\ ({\rm mod}\ p - 1)
\]令 \(k = \gcd(m - 1, p - 1)\),两边同时除以 \(k\),得:
\[\frac{m - 1}{k}y \equiv 0\ ({\rm mod}\ \frac{p - 1}{k})
\]由于此时 \(\gcd(\frac{m - 1}{k}, \frac{p - 1}{k}) = 1\),因此 \(y\) 一定有 \(\frac{p - 1}{k} | y\)。由于 \(y \in [0, p - 2]\),显然,\(\frac{p - 1}{k}\) 的任意小于 \(k\) 的非负整数倍(\(0 \thicksim k - 1\) 倍)均满足条件,因此 \(y\) 共有 \(k\) 种合法取值。
因此满足 \(\sum_{x = 1}^p[x ^ m \equiv x{\ \rm mod\ }p]\) 的 \(i\) 共有 \(k + 1\) 个。
这样,本题的时间复杂度就从 \(O(\sum p_i)\) 优化至了 \(O(c \times \log p_i)\)(\(\log\) 为 \(\gcd\) 的复杂度)。
代码
线性筛求幂后暴力判断代码如下(常数莫名其妙很大...):
#include<bits/stdc++.h>
using namespace std;
#define rg register
const int e = 998244353, N = 1e4 + 10;
int mod, c, m;
inline void add(rg int& x, rg int y) {
x += y, x -= x >= mod ? mod : 0;
}
inline void mul(rg int& x, rg int y) {
x = 1ull * x * y % mod;
}
inline int qpow(rg int v, rg int p) {
rg int res = 1;
for (; p; p >>= 1, mul(v, v)) {
if (p & 1) {
mul(res, v);
}
}
return res;
}
inline int solve(rg int n) {
rg int p[N], f[N], pri[N], t;
mod = n, t = 0;
fill(p + 1, p + 1 + n, 1);
rg int res = 2;
for (rg int i = 2; i < n; ++i) {
if (p[i]) {
pri[++t] = i, f[i] = qpow(i, m);
}
res += (i == f[i]);
for (rg int j = 1, d; j <= t && (d = i * pri[j]) <= n; ++j) {
p[d] = 0;
f[d] = 1ull * f[i] * f[pri[j]] % mod;
if (i % pri[j] == 0) {
break;
}
}
}
return res;
}
int main() {
int T; scanf("%*d%d", &T);
for (rg int kase = 1; kase <= T; ++kase) {
scanf("%d%d", &c, &m);
rg int ans = 1;
for (rg int i = 1; i <= c; ++i) {
rg int x; scanf("%d", &x);
rg int v = solve(x);
mod = e, mul(ans, v);
}
printf("%d\n", ans);
}
return 0;
}
用更简单的方法代码如下:
#include<bits/stdc++.h>
using namespace std;
#define rg register
const int mod = 998244353;
inline void mul(int& x, int y) {
x = 1ll * x * y % mod;
}
int main() {
int T; scanf("%*d%d", &T);
for (rg int kase = 1; kase <= T; ++kase) {
int n, m; scanf("%d%d", &n, &m);
int ans = 1;
for (rg int i = 1; i <= n; ++i) {
int x; scanf("%d", &x);
mul(ans, __gcd(m - 1, x - 1) + 1);
}
printf("%d\n", ans);
}
return 0;
}
九校联考(DL24凉心模拟) 整除(中国剩余定理+原根性质)的更多相关文章
- 九校联考-DL24凉心模拟Day2总结
T1 锻造 forging 题目描述 "欢迎啊,老朋友." 一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程. "我们这里的武器分成若干的等级,等级越高武器就 ...
- 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2
A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...
- 【九校联考-24凉心模拟】锻造(forging)
题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打, 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自 己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他 ...
- 九校联考_24OI——餐馆restaurant
凉心模拟D1T1--最简单的一道题 TAT 餐馆(restaurant) 题目背景 铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加. 题目描述 共有n 种食材,一份食材i 需要花ti 小 ...
- 九校联考 终&启
one term's ending... class:12 school:130...130...130... 至今没有看到九校的排名,如果九校排名正常的话,那yyhs的学生也太可怕了...估计要三百 ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 解题报告
P4363 [九省联考2018]一双木棋chess 题目描述 菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落 ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- [九省联考2018]秘密袭击coat
[九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...
- 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)
[BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...
随机推荐
- [C++] Template Function _ Any number of parameters
Template Function _ Any number of parameters #include<iostream> #include<cstdarg> using ...
- IO引脚复用和映射
1.端口复用 这些外设包括ADC,DAC以及串口等等. 查找STM32F429数据手册可以找到相关IO口的复用功能引脚. 注意:除ADC和DAC要配置成模拟通道外,其他的所有外设都要配置成复用功能.
- Oracle 11g 重建EM需要删除的对象
因为需求需要重建EM,重建时因为某些错误被迫停止,比如对象已存在.用户已经存在等,最终找出了创建必备的条件: 1.环境变量(Oracle和Grid在同一个用户下安装) ORACLE_HOME 要设为D ...
- qt下的跨目录多工程编译(转)
这里要编译的工程包含一个库和一个可执行文件.可执行文件依赖于库,所以要先编译库,编译后库放在lib目录里面,可执行文件放在bin目录里面. 目录结构如下: 全局的工程文件complex.pro在工程根 ...
- Java书籍经典Top10
1)Java Language Specification, Third Edition (by James Gosling) 本书由Java技术的发明者编写,是Java TM编程语言的权威性技术指南 ...
- Hadoop-2.4.0分布式安装手册
目录 目录 1 1. 前言 2 2. 部署 2 2.1. 机器列表 2 2.2. 主机名 2 2.2.1. 临时修改主机名 3 2.2.2. 永久修改主机名 3 2.3. 免密码登录范围 4 3. 约 ...
- JavaBugCharSequence
目录 文章背景 目录 问题分析 问题解决 说明 参考文章 版本记录 文章背景 新建一个项目时候,不知道为什么,代码出现java.lang.CharSequence cannot be resolved ...
- 深入理解java虚拟机(十四)正确利用 JVM 的方法内联
在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法.选中一段代码,敲下这个组合,非常简单.Eclipse也用类似的快捷键,使用 Alt+Shift+M.我讨厌长的方法,提起这个下面这个方 ...
- Mathcad操作tips:函数、符号计算
函数 1. 利用“:”进行函数定义,如 2. 函数支持range variable输入,如 3. 常用数学函数可以在Insert - Function菜单中寻得. 4. 当不确定某个名字是否是函数名时 ...
- Centos iptables防火墙设置
iptables的基本语法格式 iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]说明:表名.链名用于指定iptables命令所操作的表和链,命令选项用于指定 ...