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<iostream>
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<iostream>
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<iostream>
#include<map>
using namespace std;

map<int,int>mp;
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<<ans+res/3<<'\n';
	}
	return 0;
}

D. Unique Palindromes

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古谷彻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值