1 条题解
-
0
📝 题目大意
给定 个正整数 (),对每个 判断其正奇数约数数量与正偶数约数数量哪个更多,输出
Odd、Even或Same。💡 解题思路
-
题目分析: 的每个约数由 的质因数分解决定。将 写成 ( 为奇数),则 为 的幂次, 为奇数部分。 的任意约数可表示为 ,其中 , 是 的约数。
-
算法推导:
- 奇数约数:要求 ,即 ()。奇数约数个数 = ,即 的约数个数。
- 偶数约数:要求 ,即 (,)。对于每个 ,有 种 的取值,故偶数约数个数 = 。
- 比较奇数约数个数 与偶数约数个数 ,由于 ,只需比较 与 :
- ( 为奇数):奇数约数 ,偶数约数 ,输出
Odd。 - ():奇数约数 偶数约数 ,输出
Same。 - ():偶数约数 奇数约数,输出
Even。
- ( 为奇数):奇数约数 ,偶数约数 ,输出
- 因此只需判断 模 的余数即可,与 std.cpp 逻辑完全一致。
-
边界与细节:
- 最大可达 ,需使用
long long(64 位整数)。 - 最大 ,使用
cin/cout配合ios::sync_with_stdio(false)或直接使用即可(std.cpp 未使用加速,但数据范围内可接受)。注意每个测试用例独立输出,用\n而非endl可避免刷新缓冲区带来的性能开销。 - 注意判断顺序:先判
n % 4 == 0(Even),再判n % 2 == 0(Same),最后剩余情况为Odd。
- 最大可达 ,需使用
⏱️ 复杂度分析
- 时间复杂度:每个测试用例仅需 的取模与判断,共 个用例,总复杂度 。
- 空间复杂度:仅使用常数个变量,。
💻 标准代码 (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
- 上传者