题目描述
给你两个整数a,b,你需要输出a/b在对998244353取模意义下的数。
具体而言,对于一个分数a/b,你只需输出一个d在[0, 998244352]内,并且满足d×b(mod 998244353)=a (mod 998244353).题目保证b (mod 998244353)≠0。
输入格式
第一行一个数T(1≤T≤10^5)表示数据组数
一行两个整数a,b (1≤a,b≤998244352)保证b是质数
输出格式
T行,每行一个正整数d,与题目意义相同
输入输出样例
输入1
2 4 2 2 3
输出1
2 665496236
核心思想:
费马小定理a^(p-1)≡1(mod p)。假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p)。即:假如p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。 即 a^(p-1)%p=1
思路
a/b=a*(1/b);那么便将问题转化为了求1/b即求b的乘法逆元 。在费马小定理的表达式中a^(p-1)%p=1,可转化为(a*(a^(p-2)))%p=1,因为a*(1/a)=1,a*(a^(p-2))=1,我们不难得出1/a=a^(p-2);那么题目中求1/b的问题便迎刃而解,利用快速幂求得b^(p-2)即可,代码实现如下。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
long long power(long long a, long long b, long long k);
long long k = 998244353,result,a,b,y;
int t;
cin >> t;
while (t--)
{
cin >> a >> b;
y = power(b, k - 2, k);//求1/b
result = (a % k * y) % k;
cout << result << "\n";
}
}
long long power(long long a, long long b, long long k)//快速幂模板
{
long long ans = 1;
a = a % k;
while (b)
{
if (b % 2 == 1)
{
ans = (ans * a) % k;
}
b /= 2;
a = (a * a) % k;
}
return ans;
}