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=p1n1∗p2n2∗p3n3∗p4n4......
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=q1m1∗q2m2∗q3m3∗q4m4......
要把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
b∣a(a!=b)时,即b的质因子为a质因子的真子集,此时k可以等于1。
a
∣
b
a|b
a∣b同理。特别的,当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)部分题解