URL:https://ac.nowcoder.com/acm/contest/2720
A.素数分布
https://ac.nowcoder.com/acm/contest/2720/A
打个线性筛表,直接求和输出即可。
AC代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100005;
int num[N], prim[N];
int pn = 0;
void table(){
memset(num, -1, sizeof(num));
for(int i = 2;i < N;i++){
if(num[i]) prim[pn++] = i;
for(int j = 0;j < pn && 1LL*i*prim[j] < N;j++){
num[i*prim[j]] = 0;
if(i % prim[j] == 0) break;
}
}
}
int main() {
int T;
cin >> T;
int n;
table();
while(T--) {
cin >> n;
int ans = 0;
for(int i = 2;i<=n;i++) if(num[i]) ans++;
cout << ans << endl;
}
return 0;
}
B.食物分配
先将食物从小到大排序,判定条件为是否存在两份小的食物之和等于稍大的两份食物,即可。
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
int T;
int A[4];
int main() {
cin >> T;
while(T--) {
for(int i = 0; i < 4; i++) cin >> A[i];
sort(A,A+4);
int ans1 = A[0] + A[1];
if(A[0] + A[1] == A[2] && A[2] == A[3]) {
cout << A[3] << endl;
}else {
cout << -1<<endl;
}
}
return 0;
}
C.AHUICPC(easy version)
数据范围很小,只需要在n==10的时候多加一个A即可。
#include <iostream>
using namespace std;
int n;
int main() {
cin >> n;
if(n<10) {
cout <<"AHU";
while(n--) cout << "I";
cout << "CPC" <<endl;
}
else {
cout << "AAHUIIIIICPC"<<endl;
}
return 0;
}
D.不定方程
实际上是求两者最小公倍数LCM的相关系数,并且可以知道,a和b必然是互质的,否则即不存在。而若两者互质,交换二者即可。
AC代码
#include<iostream>
using namespace std;
typedef long long LL ;
LL gcd(LL a,LL b)
{
return b ? gcd(b,a%b):a;
}
int main()
{
int n;
cin >> n;
while(n-- ) {
LL a, b;
cin >> a >> b;
LL gcd1 = gcd(a,b);
LL lcm1 = a* b / gcd1;
if(gcd(a,b)!=1) cout << -1 << endl;
else cout << lcm1/a << " " << lcm1/b << " " << lcm1 << endl;
}
return 0;
}
F.蕊蕊上学
概率分布,在a时间段内上车的概率为(a/a+b),b时间段内为(b/a+b),数学期望即为(a^2+b^2)/(a+b)
AC代码
#include<iostream>
using namespace std;
double a, b;
int main() {
cin >> a >> b;
double c = (a*a + b*b) / (a+b);
printf("%.2lf\n",c);
return 0;
}
H.无尽大军
这题要用到唯一分解定理,将问题抽象为从1开始,要么耗费2点翻倍, 要么耗费1点实现上一个愿望。即
即n的质因数分解。
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n;
int main() {
cin >> n;
ll num = 0;
for(ll i = 2; i*i <= n; i++) {
while(n % i == 0) {
num += i;
n /= i;
}
}
if(n!=1) num += n;
cout << num << endl;
return 0;
}