1.拓展欧几里得求逆元
- #include <bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- ll x,y;
- ll eggcd(ll m,ll n)
- {
- if(n==0)
- {
- x=1;
- y=0;
- return m;
- }
- int r=eggcd(n,m%n);
- int t=x;
- x=y;
- y=t-(m/n)*y;
- return r;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- ll n,m;
- while(cin>>m>>n)
- {
- eggcd(m,n);
- if(x<0)
- {
- x+=n;
- }
- cout<<x<<endl;
- }
- return 0;
- }
2.逆元应用
在除法取余时,会出现精度问题导致结果出错
所以用逆元 可以用乘法代替除法取余
譬如
ans =(( (an * 3) - a0 ) / 2 ) % 1000000007;
和 ans =(( (an * 3) - a0 ) * (2 对 1000000007 求逆元) ) % 1000000007;
答案是相同的
51nod 1013 3的幂的和
可以用快速幂求出第N项
然后用等比求和
下面贴上自己的代码
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll N;
const ll mod=1000000007;
int quick(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
ios::sync_with_stdio(false);
cin>>N;
if(N==1)
{
cout<<1<<endl;
return 0;
}
else
{
ll k=quick(3,N),sum;
sum=(((k*3)%mod-3)*500000004)%mod;
cout<<sum+1<<endl;
return 0;
}
return 0;
}