模板——其它
int m = 63-__builtin_clzll( ss ); //保留ss的最高位1对拍
点击查看代码
#include<bits/stdc++.h>
using namespace std;
ifstream a,b;
int main(){
for(int i=0;;i++){
if(i%10==0)cerr<<i<<endl;
system("datamaker.exe > data.txt");
system("A.exe < data.txt > a.out");
system("B.exe < data.txt > b.out");
a.open("a.out");
b.open("b.out");
while(a.good() || b.good()){
if(a.get()!=b.get()){
system("pause");
return 0;
}
}
a.close(),b.close();
}
}
矩阵&向量(主要用于优化DP)
向量为横向,即向量右乘矩阵=向量
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=11;
const int P=1e9+7;
void inc(int& x,int y){
x+=y;
if(x>=P) x-=P;
}
int prd(int x,int y){
return 1ll*x*y%P;
}
int fpw(int a,int x){
int s=1;
for(;x;x>>=1,a=prd(a,a)) if(x&1) s=prd(s,a);
return s;
}
struct mtx{
int a[M][M];
void init(int _n){
for(int i=0;i<M;i++) for(int j=0;j<M;j++){
if(i==j) a[i][i]=_n;
else a[i][j]=0;
}
}
void put(char ch){
printf("%c\n",ch);
for(int i=0;i<M;i++){
for(int j=0;j<M;j++) {
cout<<a[i][j]<<" ";
}
puts("");
}
}
mtx operator * (mtx u){
mtx v;
v.init(0);
for(int k=0;k<M;k++){
for(int i=0;i<M;i++) for(int j=0;j<M;j++) inc(v.a[i][j],prd(a[i][k],u.a[k][j]));
}
return v;
}
};
struct vec{
int a[M];
vec(int _n){
for(int j=0;j<M;j++){
if(!j) a[j]=_n;
else a[j]=0;
}
}
void put(){
for(int i=0;i<M;i++) cout<<a[i]<<" "; puts("");
}
vec operator * (mtx u){
vec v(0);
for(int k=0;k<M;k++){
for(int i=0;i<M;i++) inc(v.a[i],prd(a[k],u.a[k][i]));
}
return v;
}
};