P9076 [PA2018] PIN
本题的基本思路是试除法求约数
\((1+k+c\times k)\times a=n\)\((k>1,c>1)\)
题目的答案便转化为满足此式的解数。
于是我们可以用两次试除法
- 第一次把\(n\)分解成 \(a\) 和 \(1+k+c\times k\) 。
- 第二次把 \(k+c\times k\) 分解为 \(c+1\) 和 \(k\) 。
注意把\(sqrt(n)\times sqrt(n)=n\)判重。
代码过不去的时候建议先写个暴力代码参照一下
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int n;
cin>>n;
freopen("baoli.out","w",stdout);
while(n--){
int ans=0;
for(int i=1;i<=n;i++)
for(int j=i+i;j<=n;j+=i)
for(int z=j+j;z<=n;z+=j)
if(i+j+z==n){
// cout<<i<<' '<<j<<" "<<z<<endl;
ans++;
}
cout<<ans<<endl;
}
return 0;
}
然后再去考虑暴力和正解之前出现的差别,进一步去修改自己的代码
$ AC $ 代码:
#include<iostream>
#include<cmath>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,ans=0;
void chuli(int x);
int main(){
cin>>n;
ans=0;
int m=sqrt(n);
for(int i=1;i<=m;i++)
if(n%i==0){
chuli(i);
if(i!=sqrt(n))chuli(n/i);
}
cout<<ans;
return 0;
}
void chuli(int x){
int k=n/x;
if(k<7)return;
k--;
for(int i=2;i<=sqrt(k);i++)
if(k%i==0){
if(k/i>2)ans++;
int t=k/i;
if(i!=2&&t!=i)ans++;
}
return ;
}