题解:P15288 「YLLOI-R3-T3」龙卷风

观察题目,注意到题目可以转化成把所有的数分成一样的 \(\frac{n}{k}\) 组,那么考虑计数,只要每个数出现的次数可以被 \(\frac{n}{\gcd(n,i)}\) 整除就可以了,其中 \(1\le i\le m\),枚举 \(i\) 即可。

设当前数出现的次数为 \(x\)\(!\) 为取反,那么答案就是:

\[\sum_{i=1}^m !(x\bmod\frac{n}{\gcd(n,i)}=0) \]

那么代码如下:
:::info[code]{open}

#include <bits/stdc++.h>
using namespace std;
int T;
int main()
{
    cin >> T;
    while (T--)
    {
        int n, m;
        cin >> n >> m;
        vector<int> a(n + 1);
        map<int, int> mp;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            mp[a[i]]++;
        }
        if (m == 1)
        {
            for (int i = 1; i <= n; i++)
            {
                if (a[i] != a[1])
                {
                    cout << 0 << endl;
                    goto E1;
                }
            }
            cout << 1 << endl;
            E1:
            continue;
        }
        long long ans = 0;
        bool flag = 1;
        for (int i = 1; i <= m; i++)
        {
            int k = n / __gcd(n, i);
            flag = 1;
            for (auto j : mp)
            {
                if (j.second % k != 0)
                {
                    flag = 0;
                    break;
                }
            }
            ans += flag;
        }
        cout << ans << endl;
    }
    return 0;
}
posted @ 2026-05-24 13:38  Synthx  阅读(9)  评论(0)    收藏  举报