MC0246王国傀儡师

发布于:2024-07-11 ⋅ 阅读:(28) ⋅ 点赞:(0)

目录

题目描述

格式

样例 

备注

运行限制

原题链接

代码思路


题目描述

在一个奇幻的王国中,存在着一个名叫小码哥的魔法师。小码哥手下收藏着 n 个傀儡,他靠着手下的傀儡演出赖以生存。因此,傀儡的魅力度与他的生存息息相关。他为每个傀儡都进行了编号,即从 1 到 n。对于编号为 k 的傀儡,假设存在有序整数对 (a,b,c) 满足 abc=k,那么编号为 k 的傀儡的魅力度定义为满足上式的所有有序整数对的个数之和。现在,他想知道他手下所有的傀儡的魅力度之和是多少,只有这样,他才能知道下周是否有饭吃。请将结果除以 3333 求余。

格式

输入格式:

输入包含一个整数 n,表示小码哥手下收藏着 n 个傀儡。

输出格式:

输出一行一个整数表示小码哥手下所有的傀儡的魅力度之和除以 3333 所得的余数。

样例 

输入:

3

输出:

7

备注

样例解释:
对于 k=1 的傀儡,存在如下序列的 (a,b,c),即 (1,1,1)
对于 k=2 的傀儡,存在如下序列的 (a,b,c),即 (2,1,1),(1,2,1),(1,1,2)
对于 k=3 的傀儡,存在如下序列的 (a,b,c),即 (3,1,1),(1,3,1),(1,1,3)
最终输出结果为 1+3+3=7。
其中:1≤n≤1012,1≤a,b,c≤k

运行限制

  • 时间限制:10秒 
  • 占用内存:256 M

原题链接

MC0246 王国傀儡师icon-default.png?t=N7T8https://www.matiji.net/exam/brushquestion/46/4446/16A92C42378232DEB56179D9C70DC45C

代码思路

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		long n = scanner.nextLong();
		int mod = 3333;
		long ans = 0;
		// 只要a*b*c<=n就可以了,以下分为四种情况得到

		// 1. 三个都不一样 a<b<c
		// a是最小的,所以a * a * a 一定小于n.如果大于等于n了,就不存在a<b<c这种情况了.
		for (long a = 1; a * a * a < n; a++) {
			// a * b * b 一定小于 n.
			for (long b = a + 1; a * b * b < n; b++) {
				// 满足a<b<c条件的c可以取temp次
				long temp = n / (a * b) - b;
				// 虽然上面的种种条件可以得出temp==0,但是temp是整型会截断小数,所以temp可能为0要排除
				if (temp != 0) {
					// 6种是因为 A33==6
					ans += temp * 6;
					ans %= mod;
				}
			}
		}

		// 2. 三个都一样 a=b=c
		for (long a = 1; a * a * a <= n; a++) {
			ans++;
			ans %= mod;
		}

		// 3. 两个一样 a小 b大==c大
		for (long a = 1; a * a * a < n; a++) {
			long temp = (long) (Math.sqrt(n / a) - a);
			// 虽然上面的种种条件可以得出temp==0,但是temp是整型会截断小数,所以temp可能为0要排除
			if (temp != 0) {
				// 3种是因为 A31==3
				ans += temp * 3;
				ans %= mod;
			}
		}

		// 4. 两个一样 a小==b小 c大
		for (long a = 1; a * a * a < n; a++) {
			long temp = n / a / a - a;
			// 虽然上面的种种条件可以得出temp==0,但是temp是整型会截断小数,所以temp可能为0要排除
			if (temp != 0) {
				// 3种是因为 A31==3
				ans += temp * 3;
				ans %= mod;
			}
		}

		System.out.println(ans);
	}
}