这场感觉好任性啊。。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