(数论)[SDOI2008]沙拉公主的题目描述

[SDOI2008]沙拉公主的题目描述

(^ w ^)

大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票。房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量。现在,请你帮助沙拉公主解决这个问题,由于可能张数非常大,你只需计算出对R取模后的答案即可。R是一个质数。
输入输出格式
输入格式:

第一行为两个整数T,R。R<=10^9+10,T<=10000,表示该组中测试数据数目,R为模 后面T行,每行一对整数N,M,见题目描述 m<=n

输出格式:

共T行,对于每一对N,M,输出1至N!中与M!素质的数的数量对R取模后的值困惑
输入输出样例
输入样例#1:

1 11
4 2

输出样例#1:

1

数据范围:
对于100%的数据,1 < = N , M < = 10000000
由于我们可以把n!均分为   n ! m ! \ \frac{n!}{m!}  m!n! 段,每段与n!互质的个数为   φ ( m ! ) \ \varphi(m!)  φ(m!) 个。
所以答案为:

a n s = n ! m ! φ ( m ! ) ans = \frac{n!}{m!} \varphi(m!) ans=m!n!φ(m!)

化简得

a n s = n ! m ! m ! ∏ p ∣ m ( p − 1 ) p = n ! ∏ p ∣ m ( p − 1 ) ∏ p ∣ m p ans= \frac{n!}{m!} m! \prod_{p|m} \frac{(p-1)}{p}= n! \frac{\prod_{p|m}(p-1)}{\prod_{p|m}p} ans=m!n!m!pmp(p1)=n!pmppm(p1)

所以只需要求得n!的逆元,   ∏ p ∣ m ( p − 1 ) \ \prod_{p|m}(p-1)  pm(p1)的逆元和   ∏ p ∣ m p \ \prod_{p|m}p  pmp的逆元即可,注意的是,   n ≥ R \ n \ge R  nR 时n!应消去一个R,   m ≥ R \ m \ge R  mR   ∏ p ∣ m p \ \prod_{p|m}p  pmp应消去一个R。
AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,m,t,r;
int tot=0,p[1000010],ans[10000010],is[10000010],inv[10000010];
bool f[10000010];
void work()
{
	is[0]=1;
	is[1]=1;
	inv[0]=1;
	inv[1]=1;
	ans[0]=1;
	ans[1]=1;
	int i=2,j=1;
    while(i<=10000000)
	{
        is[i]=1LL*is[i-1]*i%r;
		inv[i]=1LL*(r-r/i)*inv[r%i]%r;
        if(!f[i]) p[++tot]=i;
        j=1;
        while((j<=tot)&&(i*p[j]<=10000000))
		{
            f[i*p[j]]=1;
            if(i%p[j]==0) break;
            ++j;
        }
        ++i;
    }
    i=2;
    while(i<=10000000)
	{
        ans[i]=ans[i-1];
        if(!f[i]) ans[i]=((((1LL*ans[i])*(i-1))%r)*inv[i])%r;
        ++i;
    }
}
int main()
{
	scanf("%d%d",&t,&r);
	work();
	while(t--)
	{
		scanf("%d%d",&n,&m);
		printf("%lld\n",((1LL*is[n])*ans[m])%r);
	}
	return 0;
}

/*
1996年:东方灵异传(TOH1)
1997年:东方封魔录(TOH2)
1997年:东方梦时空(TOH3)
1998年:东方幻想乡(TOH4)
1998年:东方怪绮谈(TOH5)
2002年:东方红魔乡(TOH6)
2003年:东方妖妖梦(TOH7)
2004年:东方萃梦想(TOH7.5)
2004年:东方永夜抄(TOH8)
2005年:东方花映冢(TOH9)
2005年:东方文花帖(TOH9.5)
2007年:东方风神录(TOH10)
2008年:东方绯想天(TOH10.5)
2008年:东方地灵殿(TOH11)
2009年:东方星莲船(TOH12)
2009年:东方非想天则(TOH12.3)
2010年:东方文花帖DS(TOH12.5)
2010年:东方三月精(TOH12.8)
2011年:东方神灵庙(TOH13)
2013年:东方心绮楼(TOH13.5)
2013年:东方辉针城(TOH14)
2014年:弹幕天邪鬼(TOH14.3)
2014年:东方深秘录(TOH14.5)
2015年:东方绀珠传(TOH15)
2017年:东方凭依华(TOH15.5)
2017年:东方天空璋(TOH16)
*/
//写上这些RP++

总结

不错的综合题,考了很多数论的相关知识,需要熟练运用很多知识解决。
我写这道题的时候还不会求逆元。
不过有足够的前置知识后这道题就不是很难了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值