1 条题解

  • 0
    @ 2026-6-19 10:31:07

    📝 题目大意

    给定 TT 个正整数 NNN1018N \leq 10^{18}),对每个 NN 判断其正奇数约数数量与正偶数约数数量哪个更多,输出 OddEvenSame

    💡 解题思路

    1. 题目分析NN 的每个约数由 NN 的质因数分解决定。将 NN 写成 N=2k×mN = 2^k \times mmm 为奇数),则 k0k \geq 022 的幂次,mm 为奇数部分。NN 的任意约数可表示为 d=2a×bd = 2^a \times b,其中 0ak0 \leq a \leq kbbmm 的约数。

    2. 算法推导

      • 奇数约数:要求 a=0a = 0,即 d=bd = bbmb \mid m)。奇数约数个数 = τ(m)\tau(m),即 mm 的约数个数。
      • 偶数约数:要求 a1a \geq 1,即 d=2a×bd = 2^a \times b1ak1 \leq a \leq kbmb \mid m)。对于每个 bb,有 kkaa 的取值,故偶数约数个数 = k×τ(m)k \times \tau(m)
      • 比较奇数约数个数 τ(m)\tau(m) 与偶数约数个数 k×τ(m)k \times \tau(m),由于 τ(m)>0\tau(m) > 0,只需比较 kk11
        • k=0k = 0NN 为奇数):奇数约数 τ(m)>0\tau(m) > 0,偶数约数 00,输出 Odd
        • k=1k = 1N2(mod4)N \equiv 2 \pmod 4):奇数约数 == 偶数约数 =τ(m)= \tau(m),输出 Same
        • k2k \geq 2N0(mod4)N \equiv 0 \pmod 4):偶数约数 =k×τ(m)2×τ(m)>= k \times \tau(m) \geq 2 \times \tau(m) > 奇数约数,输出 Even
      • 因此只需判断 NN44 的余数即可,与 std.cpp 逻辑完全一致。
    3. 边界与细节

      • NN 最大可达 101810^{18},需使用 long long(64 位整数)。
      • TT 最大 2×1052 \times 10^5,使用 cin/cout 配合 ios::sync_with_stdio(false) 或直接使用即可(std.cpp 未使用加速,但数据范围内可接受)。注意每个测试用例独立输出,用 \n 而非 endl 可避免刷新缓冲区带来的性能开销。
      • 注意判断顺序:先判 n % 4 == 0Even),再判 n % 2 == 0Same),最后剩余情况为 Odd

    ⏱️ 复杂度分析

    • 时间复杂度:每个测试用例仅需 O(1)O(1) 的取模与判断,共 TT 个用例,总复杂度 O(T)O(T)
    • 空间复杂度:仅使用常数个变量,O(1)O(1)

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int t;
    	cin >> t;
    	while(t--){
    		long long n;
    		cin >> n;
    		// 若 N 能被 4 整除,说明 k >= 2,偶数约数更多
    		if(n % 4 == 0){
    			cout << "Even\n";
    			continue;
    		}
    		// 若 N 能被 2 整除但不被 4 整除,说明 k = 1,奇偶约数数量相等
    		if(n % 2 == 0){
    			cout << "Same\n";
    			continue;
    		}
    		// 剩余情况 N 为奇数,k = 0,只有奇数约数
    		cout << "Odd\n";
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    862
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者