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} 0a1010001,1b1010001
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 ap11(modp)
换句话说,就是
a p − 2 ≡ a − 1 ( m o d p ) (1) a^{p-2}\equiv a^{-1}\pmod p \tag{1} ap2a1(modp)(1)


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


但是,不要着急,题目说了还会有无解的情况。
问题是,在什么情况下 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值