社区讨论

莫名其妙的SIGSEGV

学术版参与者 5已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@loc87o8x
此快照首次捕获于
2023/10/30 09:33
2 年前
此快照最后确认于
2023/11/04 21:19
2 年前
查看原帖
rt,讲一个非常阴间的事。
下面这段代码在我上交之前均表现正常,而在我交到OJAC之后,这个代码变得非常阴间。整个代码就会在调用qp___这里马上堵死,debug提示sigsegv。在这一版代码之前,还有一个将k/=2换成k>>=1的版本,用k>>=1会炸,但是改成k/=2就没事了。且在此前,只要我的main函数调用了qp___,无论在什么地方,马上就是无法运行,连输入都不行。
有无大佬可帮本蒟蒻康康这是什么阴间内存错误。
代码如下:
CPP
#include<bits/stdc++.h>
#define rint register int
#define fu(i,a,b,d,c) for(rint i=a;i<=b&&c;i+=d)
#define fd(i,a,b,d,c) for(rint i=a;i>=b&&c;i-=d)
using namespace std;
#define MAXN 300
	struct Matrix{
		int num[MAXN][MAXN];
		int mod;
		int row,col;
		Matrix(){mod=30031;memset(num,0,sizeof(num));}
		void init(){if(row!=col)return;fu(i,1,row,1,1)num[i][i]=1;}
		int getRow(){return row;}
		int getCol(){return col;}
		void setRow(int r){row=r;}
		void setCol(int c){col=c;}
		void setLen(int s){row=col=s;}
		void setMod(int m){mod=m;}
		int* operator[](const int ind){return num[ind];}
		Matrix operator*(const int b)const{
			Matrix c;c.setRow(row);c.setCol(col);
			fu(i,1,row,1,1)fu(j,1,col,1,1)c.num[i][j]=num[i][j]*b%mod;
			return c;
		}
		Matrix operator*(Matrix b)const{
			Matrix c;
			c.setLen(row);
			fu(i,1,row,1,1){
				fu(k,1,row,1,1)if(num[i][k])
				fu(j,1,row,1,1)c.num[i][j]=(c.num[i][j]+num[i][k]*b.num[k][j])%mod;
			}
			return c;
		}
		Matrix operator^(int k)const{
			if(row!=col)return Matrix();
			Matrix ans,b;ans.setLen(row),ans.init();
			b.setLen(row);fu(i,1,row,1,1)fu(j,1,col,1,1)b.num[i][j]=num[i][j];
			while(k){
				if(k&1)ans=b*ans;
				b=b*b;
				k>>=1;
			}
			return ans;
		}
	};
inline int read(){
	char c=0,f=1;int num=0;
	while((c<'0'||c>'9')&&c!='-')((c=getchar())=='-')&&(f=-f);
	while(c>='0'&&c<='9')num=(num<<1)+(num<<3)+(c^48),c=getchar();
	return num*f;
}
const int mod=30031;
inline int lowbit(int x){return x&-x;}
inline int getnum(int x){int sum=0;while((x)&&(x-=lowbit(x),++sum>0));return sum;}
Matrix qp___(Matrix m,int k);
int n,k,p,sta[150];
Matrix trans,base;
signed main(){
	n=read(),k=read(),p=read();
	fu(i,0,(1<<p)-1,1,1)if((i&1)&&getnum(i)==k)sta[++sta[0]]=i;
	trans.setLen(sta[0]);base.setLen(sta[0]);
	fu(i,1,sta[0],1,1){//new state
		fu(j,1,sta[0],1,1){//old state
		//	if(i==j)continue;
			int tmp=(sta[j]>>1)^sta[i];
			if(!(tmp&(tmp-1)))trans.num[i][j]=1;
		}
	}
//	fu(i,1,sta[0],1,1)printf("%d ",sta[i]);
//	putchar('\n');
//	fu(i,1,sta[0],1,1){
//		fu(j,1,sta[0],1,1)printf("%d ",trans[i][j]);
//		putchar('\n');
//	}
	base.num[1][1]=1;
	Matrix ans,p=trans;
	ans.setLen(p.row);
	ans.init();
	int k=n-1;
	while(k){
		if(k&1)ans=p*ans;
		p=p*p;
		k/=2;
	}
	base=ans*base;
	printf("%d",base[sta[0]][1]);
}
Matrix qp___( Matrix m,int k){
	
	if(m.row!=m.col)return Matrix();
	Matrix p=m;
	Matrix ans;
	ans.setLen(p.row);
	ans.init();
	while(k){
		if(k&1)ans=p*ans;
		p=p*p;
		k/=2;
	}
	return ans;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...