Heavenly Blue dfs+素数筛

这颗星沾染了天与水的颜色,淡地彩虹的轮廓清晰了又模糊了,迷人夜晚中,歌曲呼唤着未知星球。文章探讨了每个星球的独特标识与数学之谜,通过一系列算法和公式,揭示了星球间联系的奥秘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Description escription
这颗星沾染了 天与水的颜色
淡地 彩虹的轮廓清晰了 又模糊了
迷人眼的夜色
你所吟唱的歌 究竟能
传达到这世界多远的角落
每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 每个星球都有自己的一标号 S,不断吟唱歌曲呼唤着另一个星球 ,,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 ,不断吟唱歌曲呼唤着另一个星球 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 标号的所有正约数之和必定等于 S,为了 ,为了 Heavenly Bule Heavenly BuleHeavenly Bule Heavenly Bule Heavenly BuleHeavenly BuleHeavenly BuleHeavenly Bule (神圣的蓝色),这个任 (神圣的蓝色),这个任 (神圣的蓝色),这个任 (神圣的蓝色),这个任 务就交给你了,追击的骑士!( -Point of No ReturnPoint of No Return Point of No Return Point of No Return Point of No ReturnPoint of No Return -)
Input Input
输入包含 T组数据
对于每组数据
输入包含一个标号 S
OutputOutput Output
对于每组数据
输出有两行,第一那些可能的星球个数 M,第 二行输出 M个标号,表示 那些星球, 标号请升序输出。 标号请升序输出。 标号请升序输出。 标号请升序输出。
Sample input 
42
Sample output 
3
20 26 41
Hint
30% S<=10^5
100% S<=2*10^9 ,T<=100
PS. 没有请输出 0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;

int S,n,m,q,i,j,k;
int d[10005],ans[1000005];
int f[1000005];
bool pri[100005];
long long a,b;

struct node
{
	int p,pp;
}p[10005];

bool isprime(int x)
{
	int i,j=(int)sqrt(x);
	
	for(i=2;i<=j;++i)
        if(x%i==0)
            return false;
	return true;
}
int gcd(int a,int b)
{
    if(!b)
        return a;
    return gcd(b,a%b);
}

void dfs(int x,int y,int z)
{
	if(z==S)
	{
		ans[++q]=y;
		return;
	}
	if(x>m)
        return;
	if(p[x].pp>S/z)
        return;
    dfs(x+1,y,z);

	if(gcd(y,p[x].p)==1)
        dfs(x+1,y*p[x].p,z*p[x].pp);
}

inline bool cmp(const node &a,const node &b)
{
    return a.pp<b.pp;
}

int main()
{
	freopen("heavenly.in","r",stdin);
	freopen("heavenly.out","w",stdout);
	for(i=2;i<=100000;++i)
        for(j=i+i;j<=100000;j+=i)
            pri[j]=true;
	
	while(scanf("%d",&S)!=EOF)
	{
		n=m=q=0;
		for(i=1,j=(int)sqrt(S);i<=j;++i)
		if(S%i==0)
		{
			d[++n]=i;
			if(i!=S/i)
                d[++n]=S/i;
		}

		sort(d+1,d+n+1);
		for(i=1;i<=n;++i)
		{
			if(d[i]>2&&isprime(d[i]-1))
                p[++m].p=d[i]-1,p[m].pp=d[i];
			for(j=2,k=(int)sqrt(d[i]);j<=k;++j)
			if(!pri[j])
			{
				a=1;b=1;
				while(a<d[i])
                    b*=j,a+=b;
				if(a==d[i])
				{
					p[++m].p=b;
					p[m].pp=d[i];
				}
			}
		}
		sort(p+1,p+m+1,cmp);
		dfs(1,1,1);
		sort(ans+1,ans+q+1);
		printf("%d\n",q);
		for(i=1;i<=q;++i)
		{
			printf("%d",ans[i]);
			if(i==q)printf("\n");
			else printf(" ");
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值