其他分享
首页 > 其他分享> > Codeforces Round #716 (Div. 2)题解

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