题意:问有几个无序二元组 ( x , y ) (x, y) (x,y) 满足 x y ≡ 1 xy ≡ 1 xy≡1 ( m o d P ) (mod \ \ P ) (mod P), 0 ≤ x < P ; 0 ≤ y < P 0 ≤ x < P; 0 ≤ y <P 0≤x<P;0≤y<P。无序二元组是指,如果 P = 10 P = 10 P=10, ( 3 , 7 ) (3,7) (3,7) 和 ( 7 , 3 ) (7,3) (7,3) 只算一次。
首先我们将式子化成方程形式: x y − k P = 1 xy-kP=1 xy−kP=1,其中 P P P为已知常数,我们将 x x x也看做一个常数,我们发现解的情况就是 g c d ( P , x ) = 1 gcd(P,x)=1 gcd(P,x)=1,也就是小于 P P P并且与 P P P互质的数的个数,即 ϕ ( P ) \phi(P) ϕ(P)。如果 x y ≡ 1 ( m o d P ) xy ≡ 1 (mod \ \ P) xy≡1(mod P),那么 ( x , y ) 和 ( y , x ) (x,y) 和 (y,x) (x,y)和(y,x)一定会各出现一次,也就是被多算了一次,而这个东西的值即为 ϕ ( P ) \phi(P) ϕ(P),但是其中 x = y x=y x=y的情况只有一次。设满足 x 2 ≡ 1 ( m o d P ) x^2 ≡ 1 (mod \ \ P) x2≡1(mod P) 的 x x x有 n u m num num个,答案即为 n u m + ϕ ( P ) 2 \frac{num+\phi(P)}{2} 2num+ϕ(P)。注意当 P = 1 P=1 P=1时答案为 1 1 1,因为 0 ∗ 0 = 1 m o d 1 0*0=1\ mod\ 1 0∗0=1 mod 1。 ϕ ( n ) = ∏ p i c i − 1 ( p i − 1 ) \phi(n) = \prod {p_i}^{c_{i}-1}(p_i-1) ϕ(n)=∏pici−1(pi−1)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p,ans,num;
int phi(int n)
{
int ans=n,a=n;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
{
ans=ans/i*(i-1);
while(a%i==0)
a/=i;
}
}
if(a>1)
ans=ans/a*(a-1);
return ans;
}
int main()
{
cin>>p;
for(int i=1;i<p;++i)
if((1ll*i*i)%p==1)
num++;
if(p==1)
{
cout<<"1";
return 0;
}
cout<<(phi(p)+num)/2;
return 0;
}