P2613 【模板】有理数取余

题目描述

给出一个有理数 $c=frac{a}{b}$ ,求 c mod 19260817 的值。

输入输出格式

输入格式:

 

一共两行。

第一行,一个整数 aa 。
第二行,一个整数 bb 。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 
233
666
输出样例#1: 
18595654

说明

对于所有数据, 0a,b1010001

Solution:

  本题太板子,不多讲。

  读入时处理一下$a,b$,先取模一下,然后直接扩欧或者费马小定理搞出$b$的逆元$b^{-1}$,最后乘下取模就好了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=10005,mod=19260817;
int la,lb,n,m;
char a[N],b[N];

il ll fast(ll s,int k){
    ll ans=1;
    while(k){
        if(k&1)ans=ans*s%mod;
        k>>=1;
        s=s*s%mod;
    }
    return ans;
}

int main(){
    scanf("%s%s",a+1,b+1);
    la=strlen(a+1),lb=strlen(b+1);
    For(i,1,la) n=((n<<3)+(n<<1)+a[i]-48)%mod;
    For(i,1,lb) m=((m<<3)+(m<<1)+b[i]-48)%mod;
    if(!m)puts("Angry!"),exit(0);
    printf("%lld",n*fast(m,mod-2)%mod);
    return 0;
}
原文地址:https://www.cnblogs.com/five20/p/9361054.html