【AtCoder】ABC 169

这 TM 是我打的最郁闷的一场,开场把 D 秒了,然后从 D 开始往回倒叙开题,结果直接栽在了 C 上,交了三发 WA,最后发现竟然是 C 没过…… B用了个 __int128 结果选错语言 CE,怒拉了个高精过来,浪费了许多时间。最终 E 也没有做出来。Rating ±0,真tm的烂。身败名裂了。

AtCoder Beginner Contest 169

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 imes 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;
} 

劣质的视屏题解

原文地址:https://www.cnblogs.com/TetrisCandy/p/ABC169.html