poj 2100 gravedyard design 还是wa了,那位大牛看了,帮我改一下我的邮箱是972997012@qq.com

这是一个使用C++编写的程序,主要功能是通过输入一个数值n,找出所有可能的x和k值使得特定公式成立,并输出符合条件的x和k值。程序首先估算k的大致范围,然后遍历可能的k值并计算对应的x值,最后验证计算结果是否符合原始输入。

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

#include <iostream>
#include<cmath>
using namespace std;
long long n;
struct pale
{
    long long x,k;
};
pale res[100000];
long long sum(long long x,long long k)
{
    return (k+1)*x*x+k*(k+1)*x+k*(k+1)*(2*k+1)/6;
}
long long gcd(long long a,long long b)
{
    if(b==0)
    return a;
    else return gcd(b,a%b);
}
int main()
{
    while(cin>>n)
    {
        if(n==0)
           break;
        long long root3;
        root3=(long long)exp(log((double )n*24)/3.0)/2;
        long long x,k,num=0,i;
        for(k=root3;k>=0;k--)
        {
            long long a=4*n;
            long long b=k*(k+1)*(k+2)/3;
            long long d=gcd(a,b);
             x=(long long)((sqrt(d)*sqrt(a/d-b/d)*sqrt(k+1))-k*(k+1))/(2*k+2);
             if(n==sum(x,k)&&x>0)
             {
                 res[num].x=x;res[num++].k=k;
              }
        }
        cout<<num<<endl;
        for(i=0;i<num;i++)
        {
            cout<<res[i].k+1<<" ";
            for(k=0;k<=res[i].k;k++)
            cout<<res[i].x+k<<" ";
            cout<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值