一个小板子
1.矩阵快速幂
#include<iostream>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
long long n,k;
const long long mod=1e9+7;
struct m{
long long a[101][101];
};
//Danwei matrix
m e;
//*
m mul(m x,m y){
m c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
c.a[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
c.a[i][j]=c.a[i][j]%mod+x.a[i][k]*y.a[k][j]%mod;
}
}
}
return c;
}
//pow(x,y)
m ksm(m x,long long y){
m ans=e;
while(y){
if(y%2==1){
ans=mul(ans,x);
}
x=mul(x,x);
y/=2;
}
return ans;
}
int main(){
//temporary
m t;
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>t.a[i][j];
}
}
for(int i=1;i<=n;i++) e.a[i][i]=1;
m ans=ksm(t,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<ans.a[i][j]%mod<<" ";
}
cout<<endl;
}
return 0;
}
2.高精加法 快乐板子
#include<iostream>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
string a,b;
int l1,l2;
int ans[550];
int x[550],y[555];
void mu(){
int lm=max(l1,l2);
for(int i=0;i<lm;i++){
ans[i]=x[i]+y[i];
}
for(int i=0;i<lm;i++){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
if(ans[lm])cout<<ans[lm];
for(int i=lm-1;i>=0;i--){
cout<<ans[i];
}
}
int main(){
cin>>a>>b;
l1=a.length();
l2=b.length();
for(int i=0;i<l1;i++)x[l1-i-1]=a[i]-'0';
for(int i=0;i<l2;i++)y[l2-i-1]=b[i]-'0';
mu();
}
3.减法 带负数的
#include<iostream>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
string a,b;
int l1,l2;
int ans[10007];
int x[10007],y[10007];
void di(int l){
for(int i=0;i<l;i++){
ans[i]=x[i]-y[i];
}
for(int i=0;i<l;i++){
if(ans[i]<0){
ans[i]+=10;
ans[i+1]--;
}
}
int f=0;
for(int i=l-1;i>=0;i--){
if(ans[i]!=0){
f=1;
}
if(f)cout<<ans[i];
}
}
int cmp(){
if(l1>l2) return 1;
if(l2>l1) return 0;
for(int i=0;i<l1;i++){
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return 0;
}
return 2;
}
int main(){
cin>>a>>b;
l1=a.length();
l2=b.length();
if(cmp()==1){
for(int i=0;i<l1;i++)x[l1-i-1]=a[i]-'0';
for(int i=0;i<l2;i++)y[l2-i-1]=b[i]-'0';
di(l1);}
else if(cmp()==0){
cout<<"-";
for(int i=0;i<l2;i++)x[l2-i-1]=b[i]-'0';
for(int i=0;i<l1;i++)y[l1-i-1]=a[i]-'0';
di(l2);
}
else cout<<0<<endl;
}
3.乘法
#include<iostream>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int ans[4006];
int l1,l2;
int a[2006];
int b[2006];
void mu(){
//for(int i=1;i<=l1;i++)ans[i]=a[i];
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
ans[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=l1+l2;i++){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
bool f=0;
for(int i=l1+l2;i>=1;i--){
if(ans[i])f=1;
if(f) cout<<ans[i];
}
}
int main(){
string x,y;
cin>>x>>y;
l1=x.length();
l2=y.length();
for(int i=1;i<=l1;i++){
a[l1-i+1]=x[i-1]-'0';
}
for(int i=1;i<=l2;i++){
b[l2-i+1]=y[i-1]-'0';
}
if(a[l1]==0||b[l2]==0)cout<<0<<endl;
else
mu();
}```