Codeforces Round 868 (Div. 2) 题解

题解:A题卡了挺久的,但是思路挺简单,明白了之后一遍过,B题还是挺简单的,纯思维题,一遍过,C题牵扯到数论问题,确实挺不容易的。。。

A. A-characteristic

思路:开始的时候想的用数组存有几个-1/1时可以产生1的个数,但发现写不出来。。。后来发现思路其实挺简单的,一共有n个数,依次计算有1、2、3、4、5...n个1时,可以产生几个1,计算是否等于k即可(居然没超时。。。)

#include
using namespace std;

int main(){
	int T,n,k;
	bool f;
	cin>>T;
	while(T--){
		f=0;
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			int a=i,b=n-i;
			if((a-1)*a/2+(b-1)*b/2==k){
				cout<<"YES"<<'\n';
				for(int i=1;i<=a;i++){
					cout<<1<<' ';
				}
				for(int i=1;i<=b;i++){
					cout<<-1<<' ';
				}
				cout<<'\n';
				f=1;
				break;
			}
		} 
		if(!f){
			cout<<"NO"<<'\n';
		}
	}
	return 0;
}

B. Sort with Step

思路:因为下标相差k的数可以交换,所以可以将每k个数分为一组,每一组的第i个数都可以互换,所以只要判断这个数是否应该在一组的这个位置即可p%k!=i%k,判断这个数取余k和当前下标取余k是否相等即可,如果超过两个数下标不匹配,则输出-1

#include
using namespace std;

int main(){
	int T,n,k,ans,p;
	bool f;
	cin>>T;
	while(T--){
		cin>>n>>k;
		ans=0;f=0;
		for(int i=1;i<=n;i++){
			cin>>p;
			if(p%k!=i%k){
				ans++;
				if(ans>2){
					f=1;
				}
			}
		}
		if(f){
			cout<<"-1"<<'\n';
		}else if(!f&&!ans){
			cout<<"0"<<'\n';
		}else{
			cout<<"1"<<'\n';
		}
	}
	return 0;
}

C. Strongly Composite

思路:数论、贪心

map可以用first、second来表示键和值

将所给的每个数进行分解,这样分解出来的数都为质数

for(int i=2;i*i<=x;i++){

        while(x%i==0){

                x/=i;

                mp[i]++;

        }

}

 最后注意!!!很重要!!!

if(x!=1){
        mp[x]++;
}

数论???结论???规律???

每两个相同的质因子相乘可组成一个强合数,如4:1 2 4,9:1 3 9,16:1 2 4 8 16,每三个不相同的质因子可以组成一个强合数,所以遍历每个数除以2,每个数取余2的和除以3即可。当然也可以解释这个规律,因为每增加一个质因子,合数的个数都增加原来数的个数。。。

比如,原来只有一个数7:1、7合数个数为0

增加一个数11:1、11变为7、11:1、7、11、77 合数个数为1,质数个数为2

增加一个数13:1、13变为7、11、13:1、7、11、13、77、91、1001合数个数为3,质数个数为3

...以此类推

#include
#include
using namespace std;

mapmp;
int main(){
	int T,n,x,t,ans,res;
	cin>>T;
	while(T--){
		mp.clear();
		t=0;ans=0;res=0;
		cin>>n;
		while(n--){
			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 i:mp){
			ans+=i.second/2;
			res+=i.second%2;
		}
		cout<

D. Unique Palindromes

你可能感兴趣的:(Codeforces,题解及总结,算法,c++,Codeforces,算法竞赛,学习)