WA,找了好久。。。
if(n!=1)
{
PRM.push_back(m);
e[PRM.size()-1]++;
}
改成
if(n!=1)
{
PRM.push_back(n);
e[PRM.size()-1]++;
}
就OK了。
还是在找约数的地方容易错啊。前面几道题这里也出了小问题。
关于如何debug。其实应该学会把找bug的范围缩小。看一看代码,觉得哪些地方比较凶险,那些地方就要花大力气去检查。那些比较鸟语花香的地方就花少点时间吧。缩小debug范围才能发现代码的破绽啊。否则一直从头到尾看来看去,也不可能深入的分析每一个细节啊。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
bool vis[33000];
vector<int>prm;
vector<int>PRM;
vector<int>ans;
int e[4000];
void pre(int n)
{
memset(e,0,sizeof(e));
PRM.clear();
for(unsigned int i=0;i<prm.size();i++)
{
if(n%prm[i]==0)
{
PRM.push_back(prm[i]);
while(n%prm[i]==0)
{
n/=prm[i];
e[PRM.size()-1]++;
}
}
if(n==1) break;
}
if(n!=1)
{
PRM.push_back(n);
e[PRM.size()-1]++;
}
}
void init()
{
int n=32000;
int m=sqrt(n+0.5);
for(int i=2;i<=m;i++) if(!vis[i])
for(int j=i*i;j<=n;j+=i) vis[j]=1;
for(int i=2;i<=n;i++) if(!vis[i]) prm.push_back(i);
}
bool handle(int a,int b)
{
bool ret=true;
for(unsigned int i=0;i<PRM.size();i++)
{
while(a%PRM[i]==0)
{
a/=PRM[i];
e[i]--;
}
while(b%PRM[i]==0)
{
b/=PRM[i];
e[i]++;
}
if(e[i]>0) ret=false;
}
return ret;
}
int main()
{
init();
while(scanf("%d %d",&n,&m)!=EOF)
{
pre(m);
ans.clear();
for(int k=1;k<n;k++)
if(handle(n-k,k))
ans.push_back(k+1);
printf("%d\n",ans.size());
for(unsigned int i=0;i<ans.size();i++)
{
if(i) printf(" ");
printf("%d",ans[i]);
}
puts("");
}
return 0;
}