【AtCoder】ABC 169
这 TM 是我打的最郁闷的一场,开场把 D 秒了,然后从 D 开始往回倒叙开题,结果直接栽在了 C 上,交了三发 WA,最后发现竟然是 C 没过…… B用了个 __int128 结果选错语言 CE,怒拉了个高精过来,浪费了许多时间。最终 E 也没有做出来。Rating ±0,真tm的烂。身败名裂了。
D Div Game
一道清新的小数论。我们对每个数做质因数分解 \(n={p_0}^{q_0}{p_1}^{q_1}...{p_x}^{q_x}\),对于每一个 \({p_i}^{q_i}\),我们找 \({q_i}\) 最多能拆分成几个不同的整数。显然,最佳的情况应该是 \(q_i=1+2+3+...+(x-1)+x\),如果 \(q_i>1+2+...+x\),那么我们就在 \(x\) 上加上少的数即可。这个非常容易去计算。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+9;
bool vst[N]; int cnt,pr[N],num[N],ans;
signed main(){
int n; cin>>n;
for(int i=2;i<=1000000;i++){
if(vst[i]) continue;
pr[++cnt]=i;
for(int j=2;j<=1000000/i;j++) vst[i*j]=1;
}
for(int i=1;i<=cnt;i++){
int p=pr[i];
while(n%p==0){
n/=p,num[i]++;
}
int a=sqrt(num[i]*2);
if(a*(a+1)>num[i]*2) a--;
ans+=a;
}
if(n!=1) ans++;
cout<<ans<<endl;
return 0;
}
C Multiplication III
发现考场代码只有一个点不能过。而且精度问题出在一个二位小数乘以100???
由于可怕的精度问题,我们要设立一个整型变量为 \(q=100b\),然后我们计算 \(q\times n ÷ 100\)。然后毒瘤的地方是,读入小数的时候要整数位小数位分开读然后再计算它乘上100……
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int n; cin>>n;
int b; cin>>b;
char c; cin>>c;
int d; cin>>d;
int q=b*100+d;
n*=q;
cout<<n/100;
return 0;
}
B Multipilication II
每次乘法前,用除法判断 两数相乘是否大于 \(10^{18}\)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,res=1;
signed main(){
scanf("%lld",&n);
while(n--){
int a; scanf("%lld",&a);
if(a==0) return puts("0"),0;
else if(1000000000000000000/a<res) res=-1;
if(res!=-1) res*=a;
if(res>1000000000000000000) res=-1;
}
printf("%lld",res);
return 0;
}
A Multipilication I
大水题。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b; cin>>a>>b; cout<<a*b;
return 0;
}
E Count Median
一个结论题。
我们稍微手动枚举一下(打表),我们发现我们可以取得最小中位数和最大中位数之间的所有中位数,都可以被取到。(至于一个感性的分析,我放在视频讲解中了)。
所以,我们按照这个写一个程序,先算出最小取到的中位数和最大取到的中位数,然后用分类讨论,等差数列求项数公式求出即可。(偶数的情况公差是0.5,奇数的情况公差是1)。
#include<bits/stdc++.h>
using namespace std;
double mn,mx;
struct num{int A,B;}a[1000009];
bool cmp1(const num&a,const num&b){return a.A<b.A;}
bool cmp2(const num&a,const num&b){return a.B<b.B;}
int main(){
int n; scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].A,&a[i].B);
sort(a+1,a+n+1,cmp1); mn=(a[(n+1)/2].A+a[(n+2)/2].A)/2.;
sort(a+1,a+n+1,cmp2); mx=(a[(n+1)/2].B+a[(n+2)/2].B)/2.;
if(n&1) printf("%d",(int)(mx-mn+1));
else printf("%d",(int)(2*(mx-mn+0.5)));
return 0;
}