【题目描述】
给定一个整数n,判断 n 是否有大于1 的奇数因数;
【输入格式】
第一行一个整数 t,表示测试数(1 <= t <= 1e4);
接下来 t 行,每行一个整数 n(2 <= n <= 1e14);
【输出格式】
若存在大于1的奇数因子,输出“YES”,否则输出“NO”;
【解题思路】
由于 n 的范围很大,所以:
(1)long long存储;
(2)不可以循环遍历判断 ==》 推导有用的性质进行直接判断;
具体性质如下:
(1)如果一个数有大于 1 的奇数因子,则必存在大于 1 的奇数质因子;
原因:奇数 = 奇数 * 奇数,所以一个大于 1 的奇数必然可以分解到出现奇数质因子;
(2)如果一个数 n 没有大于 1 的奇数因子,意味着它只有偶数因子(分解质因数),但是大于 1 的偶数质数只有 2,故除非 n 是 2 的m(m >= 1)c次幂,否则一定存在大于 1 的奇数因子;
(3)n 是 2 的幂可以二进制表示为 n & (n - 1)= 0;
链接:https://codeforces.com/blog/entry/87188
【正确代码】
1 #include <iostream> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 int main() 8 { 9 int t; 10 scanf("%d", &t); 11 while(t --) 12 { 13 ll n; 14 scanf("%lld", &n); 15 if(n & (n - 1)) puts("YES"); 16 else puts("NO"); 17 } 18 return 0; 19 }
Codeforces | 1475A Odd Divisor
原文:https://www.cnblogs.com/bxhbxh/p/15008722.html