[SDOI 2008]沙拉公主的困惑
Description
大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。
Input
第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n
Output
共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值
Sample Input
4 2
Sample Output
1
HINT
数据范围:
对于100%的数据,1 < = N , M < = 10000000
题解
首先显然在区间 $[1, M!]$ 内与 $M!$ 互素的数个数为 $\varphi(M!)$ 。
我们再考虑比 $M!$ 大的个数,值得注意的是我们存在这样一个性质:若 $x$ 与 $i$ (不)互质,则 $x+i$ 与 $i$ (不)互质。简要证明下:
现在我们证明对于整数 $x$ 若与 $i$ 互质,则 $x+i$ 也与 $i$ 互质。
采用反证法,我们假设 $gcd(x, i) = 1$ 但 $gcd(x+i, i) = b \neq 1$ 。
容易发现: \begin{cases} \begin{aligned} x+i = b\cdot k_1 \\ i = b \cdot k_2 \end{aligned} \end{cases} $k_1,k_2$ 均为整数。
所以 $x = (k_1-k_2)\cdot b$ ,故 $gcd(x, i) = b \neq 1$ ,与题设不符,原命题成立。
下证对于整数 $x$ 若与 $i$ 不互质,则 $x+i$ 也与 $i$ 不互质。
假设
$gcd(x, i) = b \neq 1$ , \begin{cases} \begin{aligned} x = b\cdot k_1
\\ i = b \cdot k_2 \end{aligned} \end{cases}$k_1,k_2$ 均为整数。
所以 $x+i = (k_1+k_2)\cdot b$ ,故 $gcd(x+i, i) = b \neq 1$ ,原命题成立。
故该题的答案
\begin{aligned} ans &= \varphi(M!) \cdot \frac{N!}{M!} \\ &= M! \cdot \prod_{p\mid M!,p~is~a~prime} \left( 1-\frac{1}{p} \right)\cdot \frac{N!}{M!} \\ &= N! \cdot \prod_{p\mid M!,p~is~a~prime} \frac{p-1}{p} \end{aligned}
因为 $M!$ 素因数是连续的一段,所以我们只要统计 $[1, M!]$ 中的所有素数积的逆元,以及所有素数 $-1$ 的乘积即可。
ps:其实这道题是有 $bug$ 的,我们注意到用线性求逆元时求的数是不能大于等于模数的,而题面中并没有强调模数 $P$ 恒大于 $N$ 和 $M$ ,将错就做吧。
//It is made by Awson on 2018.1.12
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
using namespace std;
const int N = 1e7;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
}
void write(int x) {
if (x > ) write(x/);
putchar(x%+);
} int t, n, m, p, inv[N+], pro[N+];
int prime[N+], isprime[N+], tot, A[N+], B[N+]; void pre() {
pro[] = inv[] = ; for (int i = ; i <= N; i++) pro[i] = (LL)i*pro[i-]%p, inv[i] = -(LL)p/i*inv[p%i]%p;
for (int i = ; i <= N; i++) {
if (!isprime[i]) prime[++tot] = i;
for (int j = ; j <= tot && i*prime[j] <= N; j++) {
isprime[i*prime[j]] = ; if (!(i%prime[j])) break;
}
}
A[] = B[] = , A[prime[]] = (prime[]-)%p, B[prime[]] = inv[prime[]]%p;
for (int i = ; i <= tot; i++) A[prime[i]] = (LL)A[prime[i-]]*(prime[i]-)%p, B[prime[i]] = (LL)B[prime[i-]]*inv[prime[i]]%p;
for (int i = ; i <= N; i++) {if (!A[i]) A[i] = A[i-]; if (!B[i]) B[i] = B[i-]; }
}
void work() {
read(t), read(p);
pre(); while (t--) {
read(n), read(m); write(((LL)pro[n]*A[m]%p*B[m]%p+p)%p); putchar('\n');
}
}
int main() {
work();
return ;
}
[SDOI 2008]沙拉公主的困惑的更多相关文章
- [BZOJ 2186] [SDOI 2008] 沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为 \(1\) 到 \(N\) 的阶乘,但是,政府只发行编号与 \(M!\) 互质的钞票.房地产第 ...
- BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 【BZOJ2186】沙拉公主的困惑(数论)
[BZOJ2186]沙拉公主的困惑(数论) 题面 BZOJ 题解 考虑答案是啥 先假设\(n=m\) 现在求的就是\(\varphi(m!)\) 但是现在\(n!\)是\(m!\)的若干倍 我们知道 ...
- 洛咕 P2155 [SDOI2008]沙拉公主的困惑
洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...
- BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 6103 Solved: 2060[Submit][S ...
- BZOJ2186 [Sdoi2008]沙拉公主的困惑 【数论,欧拉函数,线性筛,乘法逆元】
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 5003 Solved: 1725 [Submit] ...
- 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
随机推荐
- Python数据增强(data augmentation)库--Augmentor 使用介绍
Augmentor 使用介绍 原图 random_distortion(probability, grid_height, grid_width, magnitude) 最终选择参数为 p.rando ...
- 【备忘】Idea的那些事
说到Java的IDE,似乎eclipse和Idea是目前的主流.然而,OO的课程组却一直在推荐使用eclipse,于是很多人就这样错过了Idea这样强大的IDE工具.本文将会对于Idea和Idea的一 ...
- backpropagation
github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...
- 20162321王彪-实验二-Java面向对象程序设计
实验二Java面向对象程序设计 实验内容一 初步掌握单元测试和TDD 什么是单元测试:单元测试时开发者编写的一小段代码,用于检测被测代码的一个很小的,很明确的功能是否正确.执行单元测试,是为了证明某段 ...
- Twisted 介绍 及TCP广播系统实例
twisted 提供更多传输层 udp,tcp,tls及应用层HTTP,FTP等协议的支持,在开发方法上更提供了丰富的特性来支持异步编程 安装twisted 建议使用anaconda 安装,conda ...
- Tornado websocket应用
应用场景 WebSocket 的特点如下 适合服务器主动推送的场景(好友上线,即时聊天信息,火灾警告,股票涨停等) 相对于Ajax和Long poll等轮询技术,它更高效,不耗费网络带宽和计算资源 它 ...
- UIImage 内存细节
最近的一个项目,有大量的scrollView+imageView,当iPad启动较多程序,再启动自己的这个程序的时候,就爆内存退出了-- 后来把所有的生成图片的方法,全部由imageNamed改成了i ...
- DML数据操作语言之查询(一)
1.select语句基础 基本语句格式: select <列名>,.... from <表名>; select子句中列举出希望从表中查询出的列的名称,from子句则指定了选取 ...
- JAVA_SE基础——65.StringBuffer类 ②
字符串特点:字符串是常量:它们的值在创建之后不能更改. 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象. 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象 ...
- python入门(12)dict
python入门(12)dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例 ...