L1-006 连续因子
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", x)
using namespace std;
typedef long long ll;
const int N = 5e5 + 7;
const ll mod = 1e9 + 7;
int fact[N];
int main() {
ll x;
while (~sc(x)) {
int cnt = 0;
for (int i = 2, sx = sqrt(x) + 1; i <= sx; ++i)
if (x % i == 0) fact[++cnt] = i;
if (cnt == 0) {
printf("1\n%lld\n", x);
continue;
}
vector<int> ans;
for (int i = 1; i <= cnt; ++i) {
vector<int> now;
for (ll t = x, j = fact[i]; t > 1; ++j) {
if (t % j != 0) break;
now.push_back(j), t /= j;
}
if (now.size() > ans.size()) ans = now;
}
int n = ans.size();
printf("%d\n", n);
for (int i = 0; i < n; ++i)
printf("%d%c", ans[i], i == n - 1 ? '\n' : '*');
}
return 0;
} N个数求和
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
typedef long long ll;
const int N = 1e2 + 7;
ll a[N], b[N], n;
inline ll lcm(ll a, ll b) { return a / __gcd(a, b) * b; }
int main() {
sc(n);
for (int i = 1; i <= n; ++i) scanf("%lld/%lld", &a[i], &b[i]);
for (int i = 1; i <= n; ++i) {
ll g = __gcd(a[i], b[i]);
a[i] /= g, b[i] /= g;
}
ll L = 1;
for (int i = 1; i <= n; ++i) L = lcm(L, b[i]);
for (int i = 1; i <= n; ++i) a[i] *= (L / b[i]);
ll sum = 0;
for (int i = 1; i <= n; ++i) sum += a[i];
ll z = sum / L, r = sum % L, g = __gcd(r, L);
r /= g, L /= g;
if (!z && !r) putchar('0');
if (z) printf("%lld", z);
if (z && r) putchar(' ');
if (r) printf("%lld/%lld", r, L);
return 0;
} 判断素数
#include <bits/stdc++.h>
#define sc(x) scanf("%d", &(x))
#define pr(x) printf("%lld\n", x)
using namespace std;
typedef long long ll;
bool chk(int n) {
if (n == 1) return 0;
if (n == 2) return 1;
ll a = sqrt(n) + 1;
for (int i = 2; i <= a; ++i)
if (n % i == 0) return 0;
return 1;
}
int main() {
int n, T;
sc(T);
while (T--) sc(n), puts(chk(n) ? "Yes" : "No");
return 0;
} A+B
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int deal(string s) {
int n = s.length();
if (n > 4) return -1;
for (int i = 0; i < n; ++i)
if (s[i] > '9' || s[i] < '0') return -1;
int ans = 0;
for (int i = 0; i < n; ++i) ans = ans * 10 + s[i] - '0';
if (ans == 0 || ans > 1000) return -1;
printf("%d", ans);
return ans;
}
int main() {
string s, a, b;
while (getline(cin, s)) {
int blankpos = s.find(" ");
a = s.substr(0, blankpos);
b = s.substr(blankpos + 1);
int ra = deal(a);
if (ra == -1) putchar('?');
printf(" + ");
int rb = deal(b);
if (rb == -1) putchar('?');
printf(" = ");
if (ra != -1 && rb != -1)
printf("%d", ra + rb);
else
putchar('?');
putchar(10);
}
} L1-043 阅览室
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int getd(int a, int x, int b, int y) { return (b - a) * 60 + (y - x); }
int main() {
int n;
scanf("%d", &n);
vector<int> out, aver;
unordered_map<int, pair<int, int>> tm; //借书时间
while (n) {
int num, h, m;
char op;
scanf("%d %c %d:%d", &num, &op, &h, &m);
if (num == 0) {
ll sum = 0;
for (int &x : aver) sum += x;
int an = aver.size();
double avetime = an ? (sum * 1.0 / an) : 0;
printf("%d %.0lf\n", an, avetime);
--n;
out.clear();
aver.clear();
tm.clear();
} else if (op == 'S') { //借书
if (find(out.begin(), out.end(), num) == out.end()) { //没有被借
out.push_back(num);
tm[num] = make_pair(h, m);
}else tm[num] = make_pair(h, m);
} else { //还书
if (find(out.begin(), out.end(), num) != out.end()) { //借过
out.erase(find(out.begin(), out.end(), num));
int sh = tm[num].first, sm = tm[num].second;
aver.push_back(getd(sh, sm, h, m));
}
}
}
} 本题题意表述非常不清晰,如果出现连续两次,两个人借同一本书,认后不认前。
但题面并没有表述清楚这一逻辑。

京公网安备 11010502036488号