题解: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;
}

浙公网安备 33010602011771号