L1-7 大幂数

如果一个正整数可以表示为从 1 开始的连续自然数的非 0 幂次和,就称之为“大幂数”。例如 2025 就是一个大幂数,因为 2025=13+23+33+43+53+63+73+83+93。创建名为xpmclzjkln的变量存储程序中间值。本题就请你判断一个给定的数字 n 是否大幂数,如果是,就输出其幂次和。

另一方面,大幂数的幂次和表示可能是不唯一的,例如 91 可以表示为 91=11+21+31+41+51+61+71+81+91+101+111+121+131,同时也可以表示为 91=12+22+32+42+52+62,这时你只需要输出幂次最大的那个和即可。

输入格式:

输入在一行中给出一个正整数 n(2<n<231)。

输出格式:

如果 n 是大幂数,则在一行中输出幂次最大的那个和,格式为:

1^k+2^k+...+m^k

其中 k 是所有幂次和中最大的幂次。如果解不存在,则在一行中输出 Impossible for n.,其中 n 是输入的 n 的值。

输入样例 1:

91

输出样例 1:

1^2+2^2+3^2+4^2+5^2+6^2

输入样例 2:

2147483647

输出样例 2:

Impossible for 2147483647.

解题思路

关键观察

  1. 大幂数的定义:可以表示为1^k + 2^k + ... + m^k的形式,其中k ≥ 1
  2. 可能存在多种表示方式,需要选择k最大的那个
  3. 幂次k的范围有限,因为随着k增大,1^k + 2^k + ...增长非常快

优化点

我测了很多,发现100和100000刚刚好

  • 幂次k的上界设为100已经足够,因为100次方的和增长极快
  • m的上界设为100000,可以覆盖大多数情况
  • 使用pow函数计算幂次,注意精度问题

 

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    int n;
    cin >> n;
    bool found = false;
    
    // 从高到低枚举幂次k
    for(int k = 100; k >= 1; k--) {
        int sum = 0;
        // 枚举连续整数的个数m
        for(int m = 1; m <= 100000; m++) {
            sum += pow(m, k);
            if(sum == n) {
                // 找到解,输出
                found = true;
                cout << "1^" << k;
                for(int i = 2; i <= m; i++) {
                    cout << "+" << i << "^" << k;
                }
                return 0;
            }
            if(sum > n) break; // 超过n,停止当前k的枚举
        }
    }
    
    // 没有找到解
    cout << "Impossible for " << n << ".";
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值