社区讨论
莫名其妙的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 条回复,欢迎继续交流。
正在加载回复...