BZOJ 2186 SDOI 2008 沙拉公主的困惑 数论

题目大意:求出1~N!中与M!互质的数的个数,保证N>M。

前言:最讨厌数学了。。。

思路:因为保证了n>m,所以n!一定是m!的倍数。如果找到了一个x使得gcd(x,m!)==1,那么gcd(x + m!,m!) == 1一定成立,gcd(x + k * m!,m!) == 1(k >= 1)也一定成立。x的个数就是φ(m!),那么总的个数就是φ(m!) * n! / m!。之后各种推公式,就可以用线性筛来解决这个问题。(我太弱,讲不明白。。。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 10000100
using namespace std;

int T,P,n,m,primes;
long long prime[500100],ans[MAX],_link[MAX],rev[MAX];
bool notp[MAX];

void Pretreatment()
{
	for(int i = 2; i < MAX; ++i) {
		if(!notp[i])	prime[++primes] = i;
		for(int j = 1;j <= primes && prime[j] * i < MAX; ++j) {
			notp[prime[j] * i] = true;
			if(i % prime[j] == 0)
				break;
		}
	}
	_link[0] = 1;
	for(int i = 1; i < MAX; ++i)
		_link[i] = _link[i - 1] * i % P;
	rev[1] = 1;
	for(int i = 2; i < MAX && i < P; ++i)
		rev[i] = (P - P / i) * rev[P % i] % P;
	ans[1] = 1;
	for(int i = 2; i < MAX; ++i) {
		if(!notp[i])
			ans[i] = ans[i - 1] * (i - 1) % P * rev[i % P] % P;
		else	ans[i] = ans[i - 1];
	}
}

int main()
{
	cin >> T >> P;
	Pretreatment();
	for(int i = 1; i <= T; ++i) {
		scanf("%d%d",&n,&m);
		printf("%d\n",_link[n] * ans[m] % P);
	}
	return 0;
}

时间: 2024-09-30 11:24:58

BZOJ 2186 SDOI 2008 沙拉公主的困惑 数论的相关文章

【bzoj2186】: [Sdoi2008]沙拉公主的困惑 数论-欧拉函数

[bzoj2186]: [Sdoi2008]沙拉公主的困惑 考虑当 gcd(a,b)=1 则 gcd(nb+a,b)=1 所以[1,N!]与M!互质的个数就是 筛出[1,M]所有的素数p[i] 以及逆元 p[i]-1 处理一下前缀积inv[x]= 然后答案就是N!*inv[x] 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring&

【BZOJ2186】【SDoi2008】沙拉公主的困惑 数论

Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可.R是一个质数. Input 第一行为两个整数T,R.R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n Outp

BZOJ 2186 SDOI2008 沙拉公主的困惑 数论

题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n) 首先T<=1W,暴力肯定过不去,我们须要预处理一些东西 首先我们知道,若x与y互质,则x+y与y也互质,x+2y与y也互质... 换到这道题上来说,若一个数x与m!互质,那么x+(m!)也一定与m!互质,(x+m!*2)也一定与m!互质... 因为n!一定是m!的倍数,于是我们每存在到一个x<=m!与m!互质,我们就一定能找到(n!)/(m!)个与m!互质的数 而m

bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数

bzoj 2186 [Sdoi2008]沙拉公主的困惑 题意: 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可.R是一个质数. 限制: 数据组数T:1 <= T <= 10000 R <= 1e9+10 1 <= N,M <=10000000

2186: [Sdoi2008]沙拉公主的困惑 - BZOJ

Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可.R是一个质数. Input 第一行为两个整数T,R.R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行一对整数N,M,见题目描述 m<=n Outp

数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一 大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可. R是一个质数. Input 第一行为两个整数T,R.R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模后面T行,每行

BZOJ 2186: [Sdoi2008]沙拉公主的困惑 (逆元的应用)

传送门 Problem 2186. – [Sdoi2008]沙拉公主的困惑 2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3058  Solved: 1040[Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大

大视野2186: 沙拉公主的困惑(求逆元)

2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2616  Solved: 880 [Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张

【bzoj2186】[Sdoi2008]沙拉公主的困惑

2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3303  Solved: 1129[Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张数