P2613 【模板】有理数取余

快速链接


原题链接

P2613
AC记录:Accepted

题目大意

给出一个有理数 c = a b c=\frac ab c=ba​,求 c   m o d   19260817 c\bmod 19260817 cmod19260817。

输入格式

一共两行。
第一行一个整数 a a a。
第二行一个整数 b b b。

输出格式

一个整数,代表求余后的结果。如果无解,输出Angry!

S a m p l e \mathbf{Sample} Sample I n p u t \mathbf{Input} Input

233
666

S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output

18595654

H i n t & E x p l a i n \mathbf{Hint\&Explain} Hint&Explain

数据范围

对于 100 % 100\% 100%的数据, 0 ≤ a ≤ 1 0 10001 , 1 ≤ b ≤ 1 0 10001 0\le a\le 10^{10001},1\le b\le 10^{10001} 0≤a≤1010001,1≤b≤1010001。
a , b a,b a,b 不同时是 19260817 19260817 19260817 的倍数。

解题思路

首先,你需要知道…


1. 费 马 小 定 理 \large\sf1.费马小定理 1.费马小定理
当 p p p 为质数,且正整数 a a a 与 p p p 不互质时, a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod p ap−1≡1(modp)。
换句话说,就是
a p − 2 ≡ a − 1 ( m o d p ) (1) a^{p-2}\equiv a^{-1}\pmod p \tag{1} ap−2≡a−1(modp)(1)


现在进入正题。
把原式 c = a b c=\frac ab c=ba​ 改一下,就可以得到
c = a ⋅ b − 1 c=a\cdot b^{-1} c=a⋅b−1
因为 19260817 19260817 19260817 是一个质数,则可以把 ( 1 ) (1) (1) 代入得
c = a ⋅ b p − 2 c=a\cdot b^{p-2} c=a⋅bp−2
直接套一个快速幂就可以过了。


但是,不要着急,题目说了还会有无解的情况。
问题是,在什么情况下 a b \frac ab ba​会无解呢?
很容易可以想到,当 b = 0 ( m o d p ) b=0\pmod p b=0(modp) 时无解。
判断一下 b ( m o d p ) b\pmod p b(modp) 是否为 0 0 0 即可。


最后,还有最重要的一步,就是读入
数据范围给的上限是 1 0 10001 10^{10001} 1010001 ,所以要在读入的时候,边读入边模,达到读入后 a , b a,b a,b 都在 p p p 以内的效果。

上代码

#include<bits/stdc++.h>

#define endl '\n'

using namespace std;

#define int long long

int power(int a,int b,int p)
{
    int tar=1;
    while(b)
    {
        if(b&1)
            tar=(tar*a)%p;
        a=(1ll*a*a)%p;
        b>>=1;
    }
    return tar;
}

int read(int p)
{
    int tar=0;
    string s;
    cin>>s;
    for(int i=0; i<s.size(); i++)
        tar=(tar*10+s[i]-'0')%p;
    return tar;
}

const int   p=19260817;
int         a,b;

signed main()
{
    // freopen("test.in","r",stdin);
    // freopen("test.out","w",stdout);
    /* Code */
    a=read(p);
    b=read(p);
    if(b==0)
        cout<<"Angry!"<<endl;
    else
        cout<<(a*power(b,p-2,p))%p<<endl;
    // fclose(stdin);
    // fclose(stdout);
    return 0;
}

完美切题 ∼ \sim ∼

上一篇:CF1642B 题解


下一篇:[loj6797]QC QC