1.快速幂模板
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int qmi(int a,int k,int p)
{
int res=1;
while(k)
{
if(k&1)
res=(ll) res*a%p;
k>>=1;
a=(ll)a*a%p;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,k,p;
scanf("%d%d%d",&a,&k,&p);
printf("%d\n",qmi(a,k,p));
}
return 0;
}
2.快速幂求乘法逆元:使用费马定理,即求b^(p-2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int qmi(int a,int k,int p)
{
ll res=1;
while(k)
{
if(k&1) res=(ll) res*a%p;
k>>=1;
a=(ll)a*a%p;
}
return res;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,p;
scanf("%d%d",&a,&p);
if(a%p) printf("%d\n",qmi(a,p-2,p));
else puts("impossible");
}
return 0;
}
3.扩展欧几里得算法
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
int x,y;
exgcd(a,b,x,y);
printf("%d %d\n",x,y);
}
return 0;
}
4.线性同余方程:使用扩展欧几里得算法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b,m;
scanf("%d%d%d",&a,&b,&m);
int x,y;
int d=exgcd(a,m,x,y);
if(b%d) puts("impossible");
else printf("%d\n",(ll) b/d*x%m);
}
return 0;
}
5.高斯消元法解线性方程组
#include <bits/stdc++.h>
using namespace std;
const int N=110;
const double eps=1e-6;
int n;
double a[N][N];
int gass()
{
int c,r;
for(c=0,r=0;c<n;c++)
{
int t=r;
for(int i=r;i<n;i++)
if(fabs(a[i][c])>fabs(a[t][c]))
t=i;
if(fabs(a[t][c])<eps) continue;
for(int i=c;i<n+1;i++) swap(a[t][i],a[r][i]);
for(int i=n;i>=c;i--) a[r][i]/=a[r][c];
for(int i=r+1;i<n;i++)
if(fabs(a[i][c])>eps)
for(int j=n;j>=c;j--)
a[i][j]-=a[r][j]*a[i][c];
r++;
}
if(r<n)
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps)
return 2;
return 1;
}
for(int i=n-1;i>=0;i--)
for(int j =i+1;j<n;j++)
a[i][n]-=a[j][n]*a[i][j];
return 0;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
cin>>a[i][j];
int t=gass();
if (t==0)
{
for(int i=0; i<n; i++ ) printf("%.2f\n", a[i][n]);
}
else if (t==1) puts("Infinite group solutions");
else puts("No solution");
return 0;
}
6.高斯消元求异或线性方程组的根
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int n;
int a[N][N];
int gauss()
{
int c,r;
for(c=r=0;c<n;c++)
{
int t=r;
for(int i=r;i<n;i++)
if(a[i][c]) t=i;
if(!a[t][c]) continue;
for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]);
for(int i=r+1;i<n;i++)
if(a[i][c])
for(int j=n;j>=c;j--) a[i][j]^=a[r][j];
r++;
}
if(r<n)
{
for(int i=r;i<n;i++)
if(a[i][n]) return 2;
return 1;
}
for(int i=n-1;i>=0;i--)
for(int j=i+1;j<n;j++)
a[i][n]^=a[i][j]*a[j][n];
return 0;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
cin>>a[i][j];
int t=gauss();
if(t==0)
{
for(int i=0;i<n;i++) cout<<a[i][n]<<endl;
}
else if(t==1) puts("Multiple sets of solutions");
else puts("No solution");
return 0;
}