SDUT 3257 Cube Number

本文探讨了使用哈希算法解决在给定范围内找出满足立方数乘积条件的数对问题,详细介绍了哈希算法的实现过程及优化策略。

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

和上一题类似的一个题

给出n(n1e6)个数ai1e6,问其中有多少个数对满足这个数对的乘积是立方数

对于一个数x=i=1npeii

我们记sim(x)=i=1npeimod3i,sym(x)=i=1np3eimod3i

那么其实一个数对(x,y)能满足他们的乘积是方立方数当且仅当sim(x)=sym(y)

当然这也等价于sym(x)=sim(y),(想一想,为什么

然后还是用哈希就好,值得注意的是sym(a)最大可能超过1e11,处理方法是不予统计(

代码如下

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

const int maxn = 1123456;
#define LL long long
LL pri[maxn];
LL unp[maxn];

void sieve(){
    memset(pri,-1,sizeof(pri));
    pri[1] = 1;
    unp[1] = 1;
    for(LL i=2;i<maxn;i++){
        if(pri[i] == -1){
            pri[i] = i;
            unp[i] = i*i;
            for(int j=i*2;j<maxn;j+=i){
                if(pri[j] == -1) pri[j] = i,unp[j] = i*i;
                else pri[j] *= i,unp[j] *= i*i;
            }
            int cnt = 1;
            for(LL j=i*i;j<maxn;j*=i){
                cnt++;
                for(LL k=1;k*j<maxn;k++){
                    if(cnt % 3 == 1){
                        pri[k*j] *= i;
                        unp[k*j] *= i*i;
                    }
                    if(cnt % 3 == 2){
                        pri[k*j] *= i;
                        unp[k*j] /= i;
                    }
                    if(cnt % 3 == 0){
                        pri[k*j] /= i*i;
                        unp[k*j] /= i;
                    }
                }
            }
        }
    }
}

int Hash[maxn];

int main(){
    int T;
    sieve();
    scanf("%d",&T);
    int n;
    while(T-- && ~scanf("%d",&n)){
        int x;
        LL ans = 0;
        memset(Hash,0,sizeof(Hash));
        while(n--){
            scanf("%d",&x);
            if(unp[x] < maxn)
                ans += Hash[unp[x]];
            Hash[pri[x]]++;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
<think>好的,用户需要编写一个Java程序来计算通过工作减掉的磅数。首先,我得明确用户的需求。他们提到“工作量”和“减肥磅数”之间的关系,可能是指根据某种活动消耗的卡路里转换为减少的体重。通常,减掉一磅脂肪大约需要消耗3500千卡的热量。因此,算法可能需要根据用户的工作量(比如运动时间、类型)计算消耗的卡路里,再转换为磅数。 接下来,我需要参考用户提供的引用。引用[1]提到使用/和%操作符提取数字的各位数,这可能和输入处理有关,但不确定。引用[2]和[4]涉及Java的输入输出格式,特别是保留三位小数,这在结果输出时会用到。引用[3]中的方法检查字符串有效性,可能和输入验证有关,比如验证用户输入的工作量是否合法。 用户可能需要程序的基本结构:输入活动类型、时间,计算消耗的卡路里,再转换为磅数。例如,不同的活动有不同的卡路里消耗率(千卡/小时)。程序需要用户选择活动类型,输入时间,然后计算总消耗,再除以3500得到磅数。 需要注意输入验证,比如时间不能为负数,活动类型必须在可选范围内。这可以参考引用[4]中的日期验证方法,确保用户输入的有效性。输出结果要保留三位小数,如引用[2]中的提示,使用System.out.printf("%.3f", poundsLost)。 可能的步骤: 1. 显示活动类型菜单,供用户选择。 2. 输入活动时间(小时)。 3. 根据活动类型获取每小时消耗的卡路里。 4. 计算总消耗卡路里,转换为磅数(总消耗 / 3500)。 5. 输出结果,保留三位小数。 需要处理可能的异常输入,比如非数字输入或无效的活动编号。可以使用try-catch块或输入验证循环,如引用[3]中的checkWordValidity方法类似的逻辑。 现在,把这些思路整理成结构化的Java代码,包含必要的输入输出和计算逻辑。确保使用正确的格式和引用中的提示,比如使用%.3f来格式化输出。</think>### 分步解答:计算减重磅数的JAVA程序 #### 算法原理 减重计算基于公式:$1磅≈消耗3500千卡$。通过工作量(活动时长×单位时间热量消耗)计算总热量消耗后转换为减重磅数。公式如下: $$ \text{磅数} = \frac{\text{总消耗热量}}{3500} $$ #### 代码实现 ```java import java.util.Scanner; public class WeightLossCalculator { // 定义活动类型与单位时间热量消耗(千卡/小时) private static final double[] CALORIES_PER_HOUR = { 500, // 0-跑步 300, // 1-游泳 200 // 2-步行 }; public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 输入活动类型验证(参考引用[3]的验证逻辑) int activityType = getValidActivity(sc); // 输入活动时长验证(参考引用[4]的输入规范) double hours = getValidHours(sc); // 计算热量消耗 double totalCalories = CALORIES_PER_HOUR[activityType] * hours; // 转换为磅数并格式化输出(参考引用[2]的输出规范) double poundsLost = totalCalories / 3500; System.out.printf("减重磅数: %.3f 磅", poundsLost); } private static int getValidActivity(Scanner sc) { while (true) { System.out.println("请选择活动类型:\n0-跑步(500千卡/小时)\n1-游泳(300千卡/小时)\n2-步行(200千卡/小时)"); String input = sc.nextLine(); try { int choice = Integer.parseInt(input); if (choice >= 0 && choice <= 2) return choice; System.out.println("请输入0-2之间的数字"); } catch (NumberFormatException e) { System.out.println("输入无效,请重新输入"); } } } private static double getValidHours(Scanner sc) { while (true) { System.out.print("请输入活动时长(小时): "); String input = sc.nextLine(); try { double hours = Double.parseDouble(input); if (hours > 0) return hours; System.out.println("时长必须大于0"); } catch (NumberFormatException e) { System.out.println("输入无效,请重新输入"); } } } } ``` #### 代码说明 1. **活动类型验证**:使用循环结构确保用户输入0-2的整数,类似引用[3]的`checkWordValidity`方法逻辑 2. **时长验证**:通过异常捕获确保输入为有效正数,符合引用[4]的输入规范要求 3. **核心计算**:采用`/`运算符计算热量消耗(参考引用[1]的运算符使用建议) 4. **格式化输出**:使用`printf("%.3f")`保留三位小数,遵循引用[2]的输出格式标准
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值