题目
阿克克希是求婚总动员的队长,他通过自己的双手,成就了无数年轻人的梦,但他却留下了悲伤的泪水。
求婚是非常费力的,他手上有 P−1个求婚请求,这 i 个人的编号为 [1,P−1]
面对第 i个人他的求婚麻烦值为:i 在模 P意义下的逆元。他现在想知道总的麻烦值。
tips:
如果有任意一个编号 i 在模 P 意义下不存在逆元,请输出 AKCniubi
输入格式
一行一个数 P
表示求婚请求总数
输出格式
一行一个数表示总麻烦值
若有数存在无逆元的情况,输出 AKCniubi
数据范围
对于 30%
的数据,P<=1000000
扫描二维码关注公众号,回复:
13146207 查看本文章
对于 50%
的数据,P<=10000000
对于 100%
的数据,P<=231
Sample Input
3
Sample Output
3
解题
1.根据逆元的定义,gcd(i,p)==1才有逆元,而i的值是1~p-1,所以对于非质数来说,一定存在i与p不互质,也就是不存在逆元,直接AKCniubi
2.然后看质数的i的逆元
从上面很容易看出,和就是1+2+3+…+p-1
所以实际上这是一个素数判断+找规律的水题
3.要注意当p==2时,逆元不符合这个规律,要另外写
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll inv2(ll a,ll m)
{
return a==1?1:(m-m/a)*inv2(m%a,m)%m;
}
bool isprime(ll a)
{
for(ll i=2;i<=sqrt(a);i++)
if(a%i==0)
return false;
return true;
}
int main()
{
ll p;
cin>>p;
if(!isprime(p))
{
cout<<"AKCniubi";
return 0;
}
/*for(int i=1;i<p;i++)
cout<<inv2(i,p)<<" ";
cout<<endl;*/
ll sum=(p-1)/2*p;
if(p==2)
sum=1;
cout<<sum;
return 0;
}