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

Posted JophieQu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Codeforces Round #725 (Div. 3)Codeforces-1538的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Codeforces Round #725 (Div. 3)部分题解

Codeforces Round #725 (Div. 3) ABCDEFG题解

Codeforces Round #725 (Div. 3) 题解(A-G)