求大佬康康这段代码为什么会re
查看原帖
求大佬康康这段代码为什么会re
243956
cmyhhh楼主2020/5/9 21:27

为什么会runtime error?

#include<iostream>
#include<cmath>
#include<cstring>
const int maxn=100010;
using namespace std;
int n,m,cot=0,flag=0;
int a[100500];
int prime[maxn],e[maxn],ans[maxn];
void add(int m){            //加上n-i分解的因数 
	int li=(int)(sqrt(m)+0.5);
	for(int i=2;i<=li;i++){
		if(m%i==0){
			while(m%i==0){
				m/=i;
				a[i]++;
			}
			if(m==1) break;
		}		
	}
	if (m!=1) {
        a[m]++;      
    }
}
void minu(int m){           //减去i的因数 
	int li=(int)(sqrt(m)+0.5);
	for(int i=2;i<=li;i++){
		if(m%i==0){
			while(m%i==0){
				m/=i;
				a[i]--;
			}
			if(m==1) break;
		}
	}
	if(m!=1){
        a[m]--;      
    }
}
void udt(int m){          //分解 m 
	memset(e,0,sizeof(e)); 
	int li=(int)(sqrt(m)+0.5);
	cot=0;
	for(int i=2;i<=li;i++){
		if(m%i==0){
			prime[++cot]=i;
			while(m%i==0){
				m/=i;
				e[cot]++;
			}	
		} 
		if(i>100000) flag=1;
		if(m==1) break;	
	}
	if (m!=1) {
        prime[++cot]=m;
		e[cot]++;      
    }
}
bool check(){
	for(int i=1;i<=cot;i++){
		if(a[prime[i]]<e[i]){
			return false;
		}
	}
	return true;
}
int main(){
	while(cin>>n>>m){
		flag=0;
		memset(a,0,sizeof(a));
		int num=0;
		udt(m);
		if(flag==1){
			cout<<"0"<<endl;
			cout<<endl;
			continue;
		}
		for(int i=1;i<n-1;i++){
			add(n-i);
			minu(i);
			if(check()) ans[num++]=i+1;
		}
		cout<<num<<endl;
		for(int i=0;i<num;i++) cout<<ans[i]<<" ";
		cout<<endl;
	}
	return 0;
}
2020/5/9 21:27
加载中...