HDU多校day2-1010I love permutation

I love permutation

题意:

给一个正整数 a a a和一个奇质数 p ( a < p ) p(a<p) p(a<p)。令数组 b [ 1 ⋯ p − 1 ] b[1\cdots p-1] b[1p1]的元素为 b i = a i m o d    p b_i=ai\mod p bi=aimodp,求 b b b中逆序对的数量模 2 2 2的结果。

思路:

又一个定理,如果 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an p p p是一个完全剩余系,且 gcd ⁡ ( k , p ) = 1 \gcd(k,p)=1 gcd(k,p)=1,那么 k a 1 , k a 2 , ⋯   , k a n ka_1,ka_2,\cdots,ka_n ka1,ka2,,kan p p p也是一个完全剩余系。
证明也很好证明。
假设不是完全剩余系,那么肯定存在 k a i ≡ k a j ( m o d    p ) ka_i\equiv ka_j(\mod p) kaikaj(modp)。那么 k ( a i − a j ) ≡ 0 ( m o d    p ) k(a_i-a_j)\equiv 0(\mod p) k(aiaj)0(modp),又因为 gcd ⁡ ( k , p ) = 1 \gcd(k,p)=1 gcd(k,p)=1,所以 a i ≡ a j ( m o d    p ) a_i\equiv a_j(\mod p) aiaj(modp)。与原本的条件相悖,所以假设不成立。
由于是求逆序对数量模 2 2 2的值,就相当于求排列的奇偶性。
我们可以通过 ∏ 0 ≤ i < j < p b i − b j ∏ o ≤ i < j < p i − j \cfrac{\prod\limits_{0\le i\lt j\lt p} b_i-b_j}{\prod\limits_{o\le i\lt j\lt p}i-j} oi<j<pij0i<j<pbibj的值来判断。因为 ∏ o ≤ i < j < p i − j > 0 , ∏ o ≤ i < j < p i − j = ∣ ∏ 0 ≤ i < j < p b i − b j ∣ \prod\limits_{o\le i\lt j\lt p}i-j>0,\prod\limits_{o\le i\lt j\lt p}i-j=|\prod\limits_{0\le i\lt j\lt p} b_i-b_j| oi<j<pij>0,oi<j<pij=0i<j<pbibj。如果有奇数个逆序对,式子的值就为 − 1 -1 1,否则为 1 1 1
把式子化简一下:
∏ 0 ≤ i < j < p b i − b j ∏ o ≤ i < j < p i − j = ∏ 0 ≤ i < j < p b i − b j i − j = ∏ 0 ≤ i < j < p a i m o d    p − a j m o d    p i − j = ∏ 0 ≤ i < j < p ( i − j ) a i − j m o d    p = a p ( p − 1 ) 2 m o d    p = a p ( p − 1 ) 2 m o d    ϕ ( p ) m o d    p = a p − 1 2 m o d    p \begin{aligned}\cfrac{\prod\limits_{0\le i\lt j\lt p} b_i-b_j}{\prod\limits_{o\le i\lt j\lt p}i-j}&=\prod\limits_{0\le i\lt j\lt p}\cfrac{b_i-b_j}{i-j}\\&=\prod\limits_{0\le i\lt j\lt p}\cfrac{ai\mod p-aj \mod p}{i-j}\\&=\prod\limits_{0\le i\lt j\lt p}\cfrac{(i-j)a}{i-j}\mod p\\&=a^{\frac{p(p-1)}{2}}\mod p\\&=a^{\frac{p(p-1)}{2}\mod \phi(p)}\mod p\\&=a^{\frac{p-1}{2}}\mod p\end{aligned} oi<j<pij0i<j<pbibj=0i<j<pijbibj=0i<j<pijaimodpajmodp=0i<j<pij(ij)amodp=a2p(p1)modp=a2p(p1)modϕ(p)modp=a2p1modp
求出 a p − 1 2 m o d    p a^{\frac{p-1}{2}}\mod p a2p1modp就可以了。
注意 a , p a,p a,p的上界是 1 0 18 10^{18} 1018,所以用__int128避免溢出。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int qpow(__int128 a,__int128 b,__int128 p)
{
	__int128 ans=1;
	while(b)
	{
		if(b&1)
			ans=ans*a%p;
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int a,p;
		cin>>a>>p;
		int v=qpow(a,(p-1)/2,p);
		cout<<(v==1?0:1)<<endl;
	}
	return 0;
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值