fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int MAX_A = 1000000;
  8.  
  9. int main() {
  10. ios_base::sync_with_stdio(false);
  11. cin.tie(nullptr);
  12.  
  13. // 筛法求最小质因子
  14. vector<int> minPrime(MAX_A + 1, 0);
  15. for (int i = 2; i <= MAX_A; i++) {
  16. if (minPrime[i] == 0) {
  17. minPrime[i] = i;
  18. for (long long j = (long long)i * i; j <= MAX_A; j += i) {
  19. if (minPrime[j] == 0) {
  20. minPrime[j] = i;
  21. }
  22. }
  23. }
  24. }
  25.  
  26. int n;
  27. cin >> n;
  28.  
  29. unordered_map<int, int> firstOccur;
  30. firstOccur[0] = 0; // 初始状态(空乘积)在位置0
  31.  
  32. int state = 0;
  33. int maxLen = -1;
  34.  
  35. for (int i = 1; i <= n; i++) {
  36. int x;
  37. cin >> x;
  38.  
  39. // 分解质因数,更新状态
  40. while (x > 1) {
  41. int p = minPrime[x];
  42. int cnt = 0;
  43. while (x % p == 0) {
  44. x /= p;
  45. cnt++;
  46. }
  47. if (cnt % 2 == 1) {
  48. // 奇数次出现,翻转该质因子的奇偶性
  49. state ^= p;
  50. }
  51. }
  52.  
  53. // 检查之前是否出现过相同状态
  54. if (firstOccur.count(state)) {
  55. int len = i - firstOccur[state];
  56. if (len > maxLen) {
  57. maxLen = len;
  58. }
  59. } else {
  60. firstOccur[state] = i;
  61. }
  62. }
  63.  
  64. if (maxLen <= 0) {
  65. cout << -1 << '\n';
  66. } else {
  67. cout << maxLen << '\n';
  68. }
  69.  
  70. return 0;
  71. }
Success #stdin #stdout 0.01s 7044KB
stdin
4
2 3 5 7
stdout
-1