欢迎来到ydclyq的博客

我是一只摆烂小狗,欢迎来到摆烂小狗的世界,我们一起摆烂吧

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 ; 
}
posted @ 2023-02-18 16:07  ydclyq  阅读(22)  评论(0编辑  收藏  举报