日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Array Elimination 运算,gcd,思维

發布時間:2025/3/19 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Array Elimination 运算,gcd,思维 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意 :

  • 給一序列,每次可選擇k個數,讓它們都減去它們的gcd,要在任意次數后這個序列變為全0,輸出所有可能的k

思路 :

  • 考慮&運算的性質,必然是每次選擇k個相同的數,才能讓這k個數全0,因此k是n的因數
  • 類似地,從二進制每位的角度,k必須是每i位上1的個數的因數
  • 因此,我們統計每位上1的個數的gcd,然后輸出這個gcd的所有因數即可
  • 特別地,當所有元素都為0時,直接輸出1~n
  • 0和任何數的gcd都是那個數,所以0作為起點,且在統計gcd時多統計最高位也沒有影響
#include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N = 35;int a[N];int gcd(int a, int b) {return b ? gcd(b, a % b) : a; }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _;cin >> _;while (_ -- ){memset(a, 0, sizeof a);int n;cin >> n;for (int i = 1; i <= n; i ++ ){int x;cin >> x;for (int j = 0; j < 30; j ++ )a[j] += (x >> j & 1);}int div = 0;for (int i = 0; i < 30; i ++ ) div = gcd(div, a[i]);if (div == 0){for (int i = 1; i <= n; i ++ ) cout << i << ' ';cout << endl;continue;}for (int i = 1; i <= div; i ++ )if (div % i == 0)cout << i << ' ';cout << endl;}return 0; }

總結

以上是生活随笔為你收集整理的Array Elimination 运算,gcd,思维的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。