计蒜客 - T3126

题目

阿克克希是求婚总动员的队长,他通过自己的双手,成就了无数年轻人的梦,但他却留下了悲伤的泪水。

求婚是非常费力的,他手上有 P−1个求婚请求,这 i 个人的编号为 [1,P−1]

面对第 i个人他的求婚麻烦值为:i 在模 P意义下的逆元。他现在想知道总的麻烦值。

tips:
如果有任意一个编号 i 在模 P 意义下不存在逆元,请输出 AKCniubi

输入格式

一行一个数 P

表示求婚请求总数
输出格式

一行一个数表示总麻烦值

若有数存在无逆元的情况,输出 AKCniubi

数据范围

对于 30%
的数据,P<=1000000

对于 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;
}

猜你喜欢

转载自blog.csdn.net/qq_44616044/article/details/107625642