题目
题目
给一个奇质数
p
p
p,一个数
a
a
a,序列
b
i
=
a
∗
i
%
p
b_i=a*i\%p
bi=a∗i%p
(
1
≤
i
≤
p
−
1
)
(1\le{i}\le{p-1} )
(1≤i≤p−1),求出序列
b
b
b中逆序对个数
%
2
\%2
%2的结果
思路
本篇博客复刻 参考这篇->dalao博客
1
,
2
,
3....
,
p
−
1
{1,2,3....,p-1}
1,2,3....,p−1是
p
p
p的完全剩余系,
a
,
2
a
,
3
a
,
.
.
.
.
(
p
−
1
)
a
a,2a,3a,....(p-1)a
a,2a,3a,....(p−1)a也是
p
p
p的完全剩余系
题目要求序列
b
b
b中逆序对个数
%
2
\%2
%2的结果,即求序列
b
b
b中逆序对的奇偶性
可转换为:
∏
0
<
i
<
j
<
p
b
i
−
b
j
i
−
j
\prod_{0<i<j<p}\frac{b_i-b_j}{i-j}
∏0<i<j<pi−jbi−bj根据这个的答案来判断,如果等于
1
1
1逆序对为偶数对,如果答案为
−
1
-1
−1,则逆序对为奇数对
化简式子:
∏
0
<
i
<
j
<
p
b
i
−
b
j
i
−
j
=
∏
0
<
i
<
j
<
p
a
∗
i
%
p
−
a
∗
j
%
p
i
−
j
=
∏
0
<
i
<
j
<
p
a
%
p
=
a
p
∗
(
p
−
1
)
2
%
p
=
a
(
p
−
1
)
2
%
p
\prod_{0<i<j<p}\frac{b_i-b_j}{i-j}=\prod_{0<i<j<p}\frac{a*i\%p-a*j\%p}{i-j}=\prod_{0<i<j<p}a\%p=a^{\frac{p*(p-1)}{2}}\%p=a^{\frac{(p-1)}{2}}\%p
∏0<i<j<pi−jbi−bj=∏0<i<j<pi−ja∗i%p−a∗j%p=∏0<i<j<pa%p=a2p∗(p−1)%p=a2(p−1)%p
求出 a ( p − 1 ) 2 % p a^{\frac{(p-1)}{2}}\%p a2(p−1)%p即可
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define int long long
//using namespace std;
const int INF = 0x3f3f3f3f;
using namespace std;
const int maxn = 1e6+10;
bool is_prime[maxn+5];
int prime[maxn+5];
int cnt=0;
inline void write(__int128 x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
inline __int128 read()
{
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
__int128 quick_pow(__int128 a,__int128 b,__int128 p){
__int128 res=1;
while(b){
if(b&1){
res=res*a%p;
}
b>>=1;
a=a*a%p;
}
return res;
}
signed main() {
int t;
cin>>t;
while(t--){
__int128 a,p;
a=read();
p=read();
if(quick_pow(a,(p-1)/2,p)==1) cout<<0<<endl;
else cout<<1<<endl;
}
return 0;
}