为啥我常数这么大。。。
查看原帖
为啥我常数这么大。。。
542905
WannaYellow楼主2022/11/8 10:55
#include <algorithm>
#include<iostream>

using i8=char;
using u8=unsigned char;
using i16=short;
using u16=unsigned short;
using i32=int;
using u32=unsigned int;
using i64=long long;
using u64=unsigned long long;
using i128=__int128;
using u128=unsigned __int128;
using f32=float;
using f64=double;
using f128=long double;

template<typename T> void read(T &x){
	char ch=getchar(),f=1;
	x=0;
	while(ch<'0'||ch>'9')f=(ch=='-')?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9')(x=x*10+(ch-'0')),ch=getchar();
	x*=f;
}
template<typename T> void readstring(T &x,const std::string &s,i32 mod){
	x=0;
	for(auto i:s)x=((i64)x*10+i-'0')%mod;
}
template<typename T,typename ...Ts> void read(T &x,Ts &...xs){
	read(x);
	read(xs...);
}
template<typename T> void write(T x){
	if(x<0)putchar('-'),x=-x;
	else if(x>9)write(x/10);
	putchar((x%10)^48);
}
template<typename T> void writesp(T x){
	write(x);
	putchar(' ');
}
template<typename T> void writeln(T x){
	write(x);
	putchar('\n');
}
template<typename T> void writelns(T x){
	writeln(x);
}
template<typename T,typename ...Ts> void write(T x,Ts ...xs){
	writesp(x);
	write(xs...);
}
template<typename T,typename ...Ts> void writeln(T x,Ts ...xs){
	write(x,xs...);
	putchar('\n');
}
template<typename T,typename ...Ts> void writelns(T x,Ts ...xs){
	writeln(x);
	writelns(xs...);
}
i32 m,p;
struct Mat{
	i32 r,c;
	i32 m[35][35];
	void clear(){
		for(i32 i=1;i<=r;i++)for(i32 j=1;j<=c;j++)m[i][j]=0;
	}
	Mat(i32 _r=0,i32 _c=0):r(_r),c(_c){this->clear();}
	void resize(i32 _r,i32 _c){this->r=_r,this->c=_c;this->clear();}
	Mat operator*(const Mat &x)const{
		Mat re(this->c,x.c);
		for(i32 i=1;i<=this->r;i++){
			for(i32 j=1;j<=this->c;j++){
				for(i32 k=1;k<=x.r;k++){
					re.m[i][j]=((i64)re.m[i][j]+(i64)this->m[i][k]*x.m[k][j])%p;
				}
			}
		}
		return re;
	}
	Mat & operator*=(const Mat &x){
		*this=(*this)*x;
		return *this;
	}
}unit,st,ans;
void write(const Mat &x){
	for(i32 i=1;i<=x.r;i++){
		for(i32 j=1;j<=x.c;j++){
			writesp(x.m[i][j]);
		}
		putchar('\n');
	}
	putchar('\n');
}
bool check(i32 x,i32 y){
	for(i32 i=0;i<m-1;i++){
		if((x>>i)&1&(x>>(i+1))&(y>>i)&(y>>(i+1)))return false;
		// writeln(1,i,x,y);
		if(((x>>i)^1)&((x>>(i+1))^1)&((y>>i)^1)&((y>>(i+1))^1)) return false;
		// writeln(1,i,x,y);
	}
	// writeln(x,y);
	return true;
}
struct BigInt{
	std::basic_string<i32> s;
	BigInt & operator=(std::string s){
		for(auto i:s)this->s+=i-'0';
		std::reverse(this->s.begin(),this->s.end());
		return *this;
	}
	bool zero(){
		return s.empty();
	}
	bool odd(){
		return s.front()&1;
	}
	void div(){
		i32 down=0;
		for(i32 i=s.size()-1;i>=0;i--){
			i32 x=(s[i]+down)>>1;
			down=((s[i]+down)&1)*10;
			s[i]=x;
		}
		while(!s.empty()&&s.back()==0){
			s.pop_back();
		}
	}

}n;
Mat qp(Mat x,BigInt y){
	Mat re=x;
	while(!y.zero()){
		// write(x);
		if(y.odd()){
			re*=x;
		}
		x*=x;
		y.div();
	}
	return re;
}
int main(){
#ifdef LOCAL
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	freopen("test.err","w",stderr);
#endif
	std::string s;
	std::cin>>s;
	n=s;
	//std::reverse(n.s.begin(),n.s.end());
	read(m,p);
	//readstring(n,s,p);
	i32 lim=(1<<m);
	unit.resize(lim,lim),st.resize(lim,1),ans.resize(1,lim);
	for(i32 i=1;i<=lim;i++)ans.m[1][i]=1;
	for(i32 i=0;i<lim;i++){
		for(i32 j=0;j<lim;j++){
			if(check(i,j)){
				unit.m[i+1][j+1]=1;
			}
		}
	}
	// write(unit);
	i32 wb=0;
	for(i32 i=1;i<=m;i++){
		wb=(wb<<1)|(i&1);
	}
	wb++;
	st.m[wb][1]=1;
	unit=qp(unit,n);
	unit*=st;
	writeln(unit.m[wb][1]);
	// writeln((i32)check(00,01),(i32)check(01,00));
	return 0;
}

我的开o2800多ms 题解的只需要200ms。。。 我哪里写慢了?

2022/11/8 10:55
加载中...