https://vjudge.net/problem/HYSBZ%20-%202186
思路:首先我们知道一个性质:如果
x
x
x与
y
y
y互质,那么
x
+
k
∗
y
x+k*y
x+k∗y也与
y
y
y互质。所以答案即为:
φ
(
m
!
)
∗
(
n
!
)
/
(
m
!
)
φ(m!)*(n!)/(m!)
φ(m!)∗(n!)/(m!),把
m
!
m!
m!进行因数分解,不难得到
m
!
=
p
1
k
1
∗
p
2
k
2
∗
…
∗
p
j
k
j
m!=p_1^{k_1}*p_2^{k_2}*…*p_j^{k_j}
m!=p1k1∗p2k2∗…∗pjkj,由欧拉函数的性质,可得:
φ
(
m
!
)
=
∏
i
=
1
j
(
p
i
−
1
)
∗
p
i
k
i
−
1
φ(m!)=\prod_{i=1}^j(p_i-1)*p_i^{k_i-1}
φ(m!)=∏i=1j(pi−1)∗piki−1,对其进行转换可得:
φ
(
m
!
)
=
∏
i
=
1
j
p
i
k
i
∗
∏
i
=
1
j
(
p
i
−
1
)
/
p
i
φ(m!)=\prod_{i=1}^jp_i^{k_i}*\prod_{i=1}^j(p_i-1)/p_i
φ(m!)=∏i=1jpiki∗∏i=1j(pi−1)/pi,不难发现这个式子的前半部分就等于
m
!
m!
m!,因此
φ
(
m
!
)
=
m
!
∗
∏
i
=
1
j
(
p
i
−
1
)
/
p
i
φ(m!)=m!*\prod_{i=1}^j(p_i-1)/p_i
φ(m!)=m!∗∏i=1j(pi−1)/pi。将这个式子带入答案化简得:
n
!
∗
∏
i
=
1
j
(
p
i
−
1
)
/
p
i
n!*\prod_{i=1}^j(p_i-1)/p_i
n!∗∏i=1j(pi−1)/pi。预处理出所有的逆元和质数算就行了。
t
i
p
s
:
tips:
tips:好像这题数据弱了,某位大佬发现了特殊情况:
以下代码可以
A
C
AC
AC,但是没有考虑上述情况。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
int t,r,n,m,k=-1;
bool vis[maxn];
int prime[maxn];
int jc[maxn],inv[maxn],ans[maxn];
void init()
{
const int MAX=1e7;
for(int i=2;i<=MAX;i++)
{
if(!vis[i])
prime[++k]=i;
for(int j=0;j<=k&&i*prime[j]<=MAX;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
jc[1]=inv[1]=1;
for(int i=2;i<=MAX;i++)
{
jc[i]=(ll)jc[i-1]*i%r;
inv[i]=(ll)(r-r/i)*inv[r%i]%r;
}
ans[1]=1;
for(int i=2,j=0;i<=MAX;i++)
{
ans[i]=ans[i-1];
if(i==prime[j])
ans[i]=(ll)ans[i]*(prime[j]-1)%r*inv[prime[j]]%r,j++;
}
}
int main()
{
scanf("%d%d",&t,&r);
init();
int res;
while(t--)
{
scanf("%d%d",&n,&m);
res=(ll)jc[n]*ans[m]%r;
printf("%d\n",res);
}
return 0;
}