Codeforces Round #716 (Div. 2)题解
作者:互联网
题目链接
被C题卡到了,最后打表出的。。。D也不会。
A题
题意:
给你n个数的序列吗,问你是否存在子序列的乘积不是一个平方数
思路:
分解质因数,判断有没有是奇数个的质因子就行。
int n, c;
map<int, int> mp;
int main()
{
IOS;
int T;
cin >> T;
while(T --)
{
mp.clear();
cin >> n;
bool flag = true;
while(n --)
{
int x;
cin >> x;
for(int i = 2 ; i * i <= x ; i ++)
{
while(x % i == 0)
{
x /= i;
mp[i] ++;
}
}
if(x > 1) mp[x] ++;
for(auto x : mp)
if(x.y & 1)
flag = false;
}
if(!flag) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
B题
题意:
给你n和k,让你构造一个n个数的序列,使其满足下列条件,问你能构造出多少种序列
思路:
由于要数尽可能大,因此肯定所有数的所有二进制位上有且只有k个0,而且分别在不同权重的位上才满足,剩下的问题就是看每个k有多少种放法了。
显然每个k的放法都是互不相干的,因此总放法为\(n^k\)
int n, k;
int main()
{
IOS;
int T;
cin >> T;
while(T --)
{
cin >> n >> k;
ll res = 1;
for(int i = 1 ; i <= k ; i ++)
res = res * n % mod;
cout << res << endl;
}
return 0;
}
C题
题意:
给你n,让你从1到n - 1的所有数中,找出最多个数,使得它们的乘积模n余1.
思路:
我是打表做的。。。据说某个巨巨现场证明了
小于n的数 与其互质数的乘积 %n == 1 / n-1
总之,就是所有和n互质的数乘起来,如果最后乘积 % n != 1,去掉最后一项(一定是 n - 1)即可。
vector<int> res;
int n, d;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
IOS;
cin >> n;
res.push_back(1);
ll sum = 1;
for(int i = 2 ; i <= n - 1 ; i ++)
{
if(gcd(i, n) == 1)
{
res.push_back(i);
sum = sum * i % n;
}
}
if(sum % n != 1) res.pop_back();
cout << res.size() << endl;
for(auto x : res)
cout << x << " ";
cout << endl;
return 0;
}
D题
据说莫队算法轻松解决,还没学,学了再补。
题意:
思路:
标签:题意,int,题解,IOS,cin,mp,716,Div,乘积 来源: https://www.cnblogs.com/luoyicong/p/14679378.html