【Codeforces Round #725 (Div. 3)】Codeforces-1538

这场感觉好任性啊。。c没调好就去云d,d写丑了过不去才回来调c。云完d后看了看榜才发现F过了一堆人,感觉没啥时间了搁了F不写了就跑路了。我好sb啊,呜呜

A. Stone Game

取三种情况的最小值(蓝色线段部分)
可能是个题解

B. Friends and Candies

void solves(){
	int n;cin>>n;
	ll sum=0;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		sum+=a[i];
	}
	if(sum%n){
		cout<<-1<<endl; return ;
	}
	ll cnt=0,avr=sum/n;
	for(int i=1;i<=n;++i){
		if(a[i]>avr) ++cnt;
	}
	cout<<cnt<<endl;
}

C. Number of Pairs

O(nlogn)的写法。
sort是nlogn,枚举每个 a i a_i ai+二分也是nlogn

void solves(){
	ll n,l,r;cin>>n>>l>>r;
	for(int i=1;i<=n;++i) cin>>a[i],b[i]=a[i];
	sort(a+1,a+1+n); 
	sort(b+1,b+1+n,greater<int>());
	ll ans=0;
	for(int i=1;i<n;++i){
		int li=l-a[i],ri=r-a[i];
		int ansl=lower_bound(a+i+1,a+n+1,li)-a;
		int ansr=lower_bound(b+1,b+n-i+1,ri,greater<int>())-b;
		if(ansr+i==n+1)continue;
		if(ansl==n+1||ansr==n+1)continue;
		ansr=n+1-ansr;
		ans+=(ansr-ansl+1);
	}
	cout<<ans<<endl;
}

D. Another Problem About Dividing Numbers

把a b进行质因子分解,算术基本定理。
a = p 1 n 1 ∗ p 2 n 2 ∗ p 3 n 3 ∗ p 4 n 4 . . . . . . a=p_1^{n_1}*p_2^{n_2}*p_3^{n_3}*p_4^{n_4}...... a=p1n1p2n2p3n3p4n4......
b = q 1 m 1 ∗ q 2 m 2 ∗ q 3 m 3 ∗ q 4 m 4 . . . . . . b=q_1^{m_1}*q_2^{m_2}*q_3^{m_3}*q_4^{m_4}...... b=q1m1q2m2q3m3q4m4......
要把a b都除到相等,那么a最多除Σ n i n_i ni次,记cnta=Σ n i n_i ni;b最多除Σ m i m_i mi次,记cntb=Σ m i m_i mi。那么k一定要≤cnta+cntb。
b ∣ a b|a ba(a!=b)时,即b的质因子为a质因子的真子集,此时k可以等于1。 a ∣ b a|b ab同理。特别的,当a=b时,显然k不可以等于1。
其他情况由于要一直除到只剩下共同质因子或者一直除到1,所以a b两边都至少除一次。即k≥2。

不明白为什么一开始o(1e4 * sqrt(1e9))会t on test6,我看别人都是3e8跑了快2s然后卡过了为什么我不行,好无语呜呜
后来筛了一遍质数才过,sqrt(1e9)内的质数顶多有1e4个嘛。筛后的复杂度应该是O(1e4 *sqrt(1e4))≈1e6,1e4是测试数据的数量t的大小,sqrt(1e4)是跑的唯一分解定理。线性筛跑了一遍的O(sqrt(1e9))≈3e4因为比较小,所以可以忽略不计。

void pre(int n=1e5){
	for(int i=2;i<=n;i++){
	    if(!vis[i])pri[++tot]=i;
	    for(int j=1;j<=tot&&pri[j]*i<=n;j++){
	        int cur=pri[j]*i;
	        vis[cur]=1;
	        if(i%pri[j]==0)break;
	    }
	}
}
void solves(){
	ll a,b,k;cin>>a>>b>>k;
	ll aa=a,bb=b;
	ll cnta=0,cntb=0,co=0;
	for(int i=1;pri[i]*pri[i]<=a;++i){
		if(a%pri[i]==0){
			while(a%pri[i]==0){
				a/=pri[i];
				++cnta;
			}
		}
	}
	if(a>1) ++cnta;
	for(int i=1;pri[i]*pri[i]<=b;++i){
		if(b%pri[i]==0){
			while(b%pri[i]==0){
				b/=pri[i];
				++cntb;
			}
		}
	}
	if(b>1) ++cntb;
	if(aa>bb)swap(aa,bb);
	if(bb%aa==0&&aa!=bb){
		if(1<=k&&k<=cnta+cntb){
			cout<<"YES\n";
		} else cout<<"NO\n";
	} else{
		if(2<=k&&k<=cnta+cntb){
			cout<<"YES\n";
		} else cout<<"NO\n";
	}
}

剩下的晚点再补把 我要去写数分作业了OvO

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值