快速幂
int ksm(int a,int b)
{
int i=1,x=a;
while(b!=0)
{
if(b&1)
i*=x;
x*=x;
b>>=1;
}
return i;
}
矩阵乘法
struct mat{ //定义矩阵结构体
long long a[maxn][maxn];
};
mat operator*(mat x,mat y){ //重载乘号(定义矩阵乘法)
mat ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return ans;
}
矩阵快速幂
mat qsortmod(mat x,int k){ //矩阵快速幂
mat s;
for(int i=1;i<=n;i++){ //单位矩阵
for(int j=1;j<=n;j++){
if(i==j) s.a[i][j]=1;
else s.a[i][j]=0;
}
}
while(k){
if(k&1) s=s*x;
k>>=1;
x=x*x;
}
return s;
}
辗转相除法
int gcd(int a, int b)
{
if(b == 0) return a;
else return gcd(b, a%b);
}
扩展欧几里得
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y) //拓展欧几里得算法
{
if(!b) {
x=1; y=0;
return a;
}
else
{
int r=exgcd(b, a % b, y, x);
y -= x * (a / b);
return r;
}
}
ll inv(ll a,ll mod) {
ll x,y;
if(exgcd(a,mod,x,y)==1) return (x%mod+mod)%mod;
return -1;
}
int main(){
int T,n,b;
cin>>T;
while(T--){
cin>>n>>b;
cout<<n*inv(b,9973)%9973<<endl;
}
}
欧拉筛欧拉函数
void get_phi()
{
int i, j, k;
k = 0;
for(i = 2; i < maxn; i++)
{
if(is_prime[i] == false)
{
prime[k++] = i;
phi[i] = i-1;
}
for(j = 0; j<k && i*prime[j]<maxn; j++)
{
is_prime[ i*prime[j] ] = true;
if(i%prime[j] == 0)
{
phi[ i*prime[j] ] = phi[i] * prime[j];
break;
}
else
{
phi[ i*prime[j] ] = phi[i] * (prime[j]-1);
}
}
}
}