1.快速幂
typedef long long LL;//视情况定类型
LL fun(LL x, LL n) {
LL res = 1;
while (n > 0) {
if (n & 1)//&按位与判奇偶 4>>1 = 4/2 2<<1 = 2*2
res = (res*x);//求幂,所以无取模
x = x*x;
n >>= 1;
}
return res;
}
2.大数加法
3.欧几里得算法gcd(求最大公约数)
最简单的方法就是应用递归算法,代码如下:
int gcd(int a,int b)
{
if(b==0)
return a;
return
gcd(b,a%b);
}
代码可优化如下:int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
当然还有一个迭代形式:int Gcd(int a, int b)
{
while(b != 0)
{
int r = b;
b = a % b;
a = r;
}
return a;
}
4.01背包模板
int dp[maxn];
int pri[maxn];// bone's
int vol[maxn];// bone's value
int n, m;//n块石头,m个体积
for(int i = 1 ; i <= n ; i++)
{
for(int j = m ; j >= 0 ; j--)
{
if(j >= vol[i])
{
dp[j] = max(dp[j], dp[j - vol[i]] + pri[i]);
}
}
}
5.完全背包模板
int dp[maxn];
int pri[maxn];// bone's
int vol[maxn];// bone's value
int n, m;//n块石头,m个体积
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <m ; j++)
{
if(j >= vol[i])
{
dp[j] = max(dp[j], dp[j - vol[i]] + pri[i]);
}
}
}
6. LCS(最长公共子序列模板)
int dp[maxn][maxn];
char a[maxn],b[maxn];
using namespace std;
int main()
{
while(~scanf("%s%s",a+1,b+1))
{
memset(dp,0,sizeof(dp));
int i,j;
for( i=1;a[i];i++)
{
for(j=1;b[j];j++)
{
if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
}
printf("%d\n",dp[i-1][j-1]);
}
return 0;
}
7.矩阵快速幂
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define LL long long
#define MAXN 1000010
using namespace std;
const int INF=0x3f3f3f3f;
//----以下为矩阵快速幂模板-----//
//const int mod=3;//模3,故这里改为3即可
int mod;
const int NUM=12;//定义矩阵能表示的最大维数
int N;//N表示矩阵的维数,以下的矩阵加法、乘法、快速幂都是按N维矩阵运算的
struct Mat{//矩阵的类
LL a[NUM][NUM];
void init()//将其初始化为单位矩阵
{
memset(a,0,sizeof(a));
for(int i=0;i<NUM;i++)
{
a[i][i]=1;
}
}
};
Mat add(Mat a,Mat b)//(a+b)%mod 矩阵加法
{
Mat ans;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
ans.a[i][j]=(a.a[i][j]%mod)+(b.a[i][j]%mod);
ans.a[i][j]%=mod;
}
}
return ans;
}
Mat mul(Mat a,Mat b) //(a*b)%mod 矩阵乘法
{
Mat ans;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
ans.a[i][j]=0;
for(int k=0;k<N;k++)
{
ans.a[i][j]=(ans.a[i][j]%mod)+(a.a[i][k]%mod)*(b.a[k][j]%mod);
}
ans.a[i][j]%=mod;
}
}
return ans;
}
Mat power(Mat a,int num)//(a^n)%mod 矩阵快速幂
{
Mat ans;
ans.init();
while(num)
{
if(num&1)
{
ans=mul(ans,a);
}
num>>=1;
a=mul(a,a);
}
return ans;
}
Mat pow_sum(Mat a,int num)//(a+a^2+a^3....+a^n)%mod 矩阵的幂和
{
int m;
Mat ans,pre;
if(num==1)
return a;
m=num/2;
pre=pow_sum(a,m);
ans=add(pre,mul(pre,power(a,m)));
if(num&1)
ans=add(ans,power(a,num));
return ans;
}
void output(Mat a)//输出矩阵
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
printf("%lld%c",a.a[i][j],j==N-1?'\n':' ');
}
}
}
//----以上为矩阵快速幂模板-----//
int v[6][6];
int main()
{
Mat A,B;
int i,j,k,n,m,x,y,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
v[i][j]=1;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
v[x-1][(y+2)%6]=0;
v[y-1][(x+2)%6]=0;
}
N=6;
mod=1e9+7;
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
A.a[i][j]=v[i][j]*4;
}
}
for(i=0;i<6;i++)
B.a[i][0]=4;
A=power(A,n-1);
Mat ans;
for(i=0;i<N;i++)
{
for(j=0;j<1;j++)
{
ans.a[i][j]=0;
for(k=0;k<N;k++)
{
ans.a[i][j]=(ans.a[i][j]%mod)+(A.a[i][k]%mod)*(B.a[k][j]%mod);
}
ans.a[i][j]%=mod;
}
}
sum=0;
for(i=0;i<N;i++)
{
sum=(sum+ans.a[i][0])%mod;
}
printf("%d\n",sum);
}
return 0;
}