带模运算的加减乘除分配律:
(a + b)%m==(a%m+b%m)%m
(a - b)%m==(a%m - b%m)%m
(a * b)%m==(a%m * b%m)%m
但是除法就不对了
(a ÷ b)%m≠≠(a%m ÷ b%m)%m
例如: (3 ÷11)%5=3/11
(3%5 ÷ 11%5)%5=3
逆元:
a ÷ a=1%m ⇒ a * %m
a ÷ b=1%m ⇒ a * %m
费马小定理:
费马小定理的条件是m为素数。
带模除法运算:
(a ÷ b)%m ⇒ 逆元:a * %m ⇒ 费马小定理: ⇒ 化简结果:
一般情况下mod取值为
用快速幂计算,时间复杂度O(logn)
long long power_mod(long long a,long long b)
{
long long ans = 1;
while (b)
{
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
a*power_mod(b,mod-2)%mod //主函数调用
例题:筱玛爱地理
链接:https://ac.nowcoder.com/acm/contest/946/A
筱玛是一个热爱地理的好筱玛。最近,在《地理II》作业本上,筱玛学到了“贝塔指数”的概念...
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define mod 1000000007
struct node
{
long long b,c;
}a[200005];
long long power_mod(long long a,long long b)
{
long long ans = 1;
while (b)
{
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
bool cmp(struct node x,struct node y)
{
return x.c*y.b>x.b*y.c;
}
int main()
{
int i,j,k,t;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%lld %lld",&a[i].b,&a[i].c);
}
sort(a,a+t,cmp);
for(i=0;i<t;i++)
{
printf("%lld\n",a[i].c*power_mod(a[i].b,mod-2)%mod);
}
return 0;
}