ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2613 【模板】有理数取余

2022-02-25 21:03:41  阅读:187  来源: 互联网

标签:le 有理数 10001 tar int 19260817 P2613 mathbf 取余


快速链接


原题链接

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 ∼

标签:le,有理数,10001,tar,int,19260817,P2613,mathbf,取余
来源: https://blog.csdn.net/ssl_ztc/article/details/123140862

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有