A
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL a, b, n;
int main(){
while (scanf("%lld%lld", &a, &b) != EOF) {
scanf("%lld", &n);
LL d = b - a;
printf("%lld\n", a + (n - 1) * d);
}
return 0;
}
B
按左端点排序,然后依次合并就行
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
struct Node {
int l, r;
}p[qq];
int a[qq], b[qq];
bool cmp(const Node &a, const Node &b) {
if (a.l == b.l) return a.r < b.r;
return a.l < b.l;
}
int main(){
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d%d", &p[i].l, &p[i].r);
}
sort(p, p + n, cmp);
int l, r;
l = r = -1;
int cnt = 0;
for (int i = 0; i < n; ++i) {
if (l == -1 && r == -1) {
l = p[i].l, r = p[i].r;
} else {
if (p[i].l <= r) r = max(r, p[i].r);
else a[cnt] = l, b[cnt] = r, cnt++, l = p[i].l, r = p[i].r;
}
}
a[cnt] = l, b[cnt] = r;
cnt++;
printf("%d\n", cnt);
for (int i = 0; i < cnt; ++i) {
printf("%d %d\n", a[i], b[i]);
}
}
return 0;
}
C
求解ax + by = c,要求存在正整数解x,y,我们可以枚举x则 y = (c - ax) / b, 要求y是正整数
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL a, b, c;
int main(){
while (scanf("%lld%lld%lld", &a, &b, &c) != EOF) {
bool f = false;
for (int i = 0; i <= c / a; ++i) {
if ((c - i * a) % b == 0) f = true;
}
if (!f) puts("No");
else puts("Yes");
}
return 0;
}
D
待补
E
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int num[qq];
int main(){
int t; scanf("%d", &t);
while (t--) {
int n; scanf("%d", &n);
int maxn = 0, cnt = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", num + i);
if (num[i] == 8) cnt++;
else cnt = 0;
maxn = max(maxn, cnt);
}
printf("%d\n", maxn);
}
return 0;
}
F
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1000000009;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
map<string, bool> mp;
char st[qq], ans[qq], cnt;
int main(){
int Cas = 0;
int t = 0;
while (scanf("%s", st) != EOF) {
mp.clear();
printf("Case %d:\n", ++Cas);
int len = strlen(st);
cnt = 0;
int word = 0;
for (int i = 0; i < len; ++i) {
if ((st[i] >= 'a' && st[i] <= 'z') || (st[i] >= 'A' && st[i] <= 'Z')) {
ans[cnt++] = st[i];
} else {
if (cnt > 0) {
ans[cnt] = '\0';
if (mp.find(ans) == mp.end()) {
mp[ans] = true;
printf("%s\n", ans);
word++;
}
}
cnt = 0;
}
}
if (cnt > 0) {
ans[cnt] = '\0';
if (mp.find(ans) == mp.end()) {
mp[ans] = true;
printf("%s\n", ans);
word++;
}
}
if (word == 0) {
puts("NO");
}
t++;
}
return 0;
}
G
看了看样例的输出,才发现每个运算符后面有一个空格
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 609929123;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
char flag[4] = {'+', '-', '*', '/'};
char st[55][55];
int main(){
int t; scanf("%d", &t);
while (t--) {
mst(st, 0);
int n; scanf("%d", &n);
int x, y;
x = y = 1;
int cnt = 0;
for (int i = 1; i <= n; ++i) {
if (i % 2 == 1) {
while (true) {
st[x][y] = flag[cnt % 4];
cnt++;
if (x + 1 > n || y + 1 > n) break;
x += 1, y += 1;
}
} else {
while (true) {
st[x][y] = flag[cnt % 4];
cnt++;
if (x - 1 < 1 || y - 1 < 1) break;
x -= 1, y -= 1;
}
}
if (i % 2 == 1) y -= 1;
else x += 1;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (st[i][j] == '+' || st[i][j] == '-' || st[i][j] == '*' || st[i][j] == '/') {
printf("%c ", st[i][j]);
} else {
printf(" ");
}
}
puts("");
}
if (t) puts("");
}
return 0;
}
素数筛之后直接暴力枚举
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int prim[qq], top;
void init() {
top = 0;
for (int i = 2; i < (1 << 15); ++i) {
bool f = true;
for (int j = 2; j * j <= i && f; ++j) {
if (i % j == 0) f = false;
}
if (f) prim[top++] = i;
}
}
int main(){
init();
int n;
while (scanf("%d", &n) != EOF) {
if (!n) break;
// printf("%d\n", top);
int cnt = 0;
for (int i = 0; i < top; ++i) {
for (int j = i; j < top; ++j) {
if (prim[i] + prim[j] == n) cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}
I
这题推一推可以发现答案是 2^(n - 1)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1000000009;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL quickPow(LL a, LL b) {
LL ans = 1;
while (b > 0) {
if (b & 1) ans = (ans * a) % MOD;
a = (a * a) % MOD;
b >>= 1;
}
return ans;
}
int main(){
LL n;
while (scanf("%lld", &n) != EOF) {
printf("%lld\n", quickPow(2, n - 1));
}
return 0;
}
J
做一个前缀和,然后枚举选择的其中两种宝物,利用前缀和统计包含这两种的选法一共有多少
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 609929123;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL num[qq], sum[qq];
int main(){
int n;
while (scanf("%d", &n) != EOF) {
sum[0] = 0;
for (int i = 1; i <= n; ++i) {
scanf("%lld", num + i);
sum[i] = sum[i - 1] + num[i];
}
LL ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j) {
ans = (ans + (num[i] * num[j]) * (sum[n] - sum[j]) % MOD) % MOD;
}
}
printf("%lld\n", ans);
}
return 0;
}
K
排个序 从最大的开始贪心
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
LL n, m;
LL num[qq];
int main(){
while (scanf("%lld%lld", &n, &m) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%lld", num + i);
}
sort(num, num + n);
int ans = 0;
for (int i = n - 1; i >= 0 && m > 0; --i) {
m -= num[i];
ans++;
}
if (m > 0) puts("-1");
else printf("%d\n", ans);
}
return 0;
}
L
如果会容斥去求1~n中与n互质的个数,那么这个题就可做了,首先求出1~n所有数的平方和,然后减去与n不互质的平方和,这一部分明显可以用容斥算
假设 2^2 + 4^2 + 6^2 .... +(2 * n)^2 = 2^2 (1^2 + 2^2 + 3^2 + ... + n^2),然后就是平方和的前n项和公式就行
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define REP(i, x, n) for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e6 + 10;
const int INF = 1e9 + 10;
bool vis[qq];
int prim[qq], top;
void init() {
mst(vis, false);
top = 0;
for (int i = 2; i <= 1e6; ++i) {
if (vis[i]) continue;
prim[top++] = i;
for (int j = 2; j * i <= 1e6; ++j) {
vis[i * j] = true;
}
}
// printf("%d\n", top);
}
vector<int> fact;
LL getNum(LL n, LL tmp) {
LL num = n / tmp;
if (num == 0) return 0;
LL x = tmp * tmp;
LL y = (num * (num + 1) * (2 * num + 1) / 6);
return x * y;
}
int main(){
init();
LL n;
while (scanf("%lld", &n) != EOF) {
if (n == 0 || n == 1) {
printf("0\n");
continue;
}
LL p = n;
for (int i = 0; i < top && p >= prim[i]; ++i) {
if (p % prim[i] == 0) {
fact.pb(prim[i]);
while (p % prim[i] == 0) {
p /= prim[i];
}
}
}
if (p > 1) fact.pb(p);
/*for (int i = 0; i < fact.size(); ++i) {
printf("%d ", fact[i]);
}
puts("");
*/ LL ans = (n) * (n + 1) * (2LL * (n) + 1) / 6;
LL cns = 0;
int k = fact.size();
for (int i = 1; i < (1 << k); ++i) {
LL tmp = 1, cnt = 0;
for (int j = 0; j < k; ++j) {
if (i & (1 << j)) tmp *= fact[j], cnt++;
}
if (cnt & 1) cns += getNum(n, tmp);
else cns -= getNum(n, tmp);
// printf("%lld %lld\n", tmp, cns);
}
printf("%lld\n", ans - cns);
fact.clear();
}
return 0;
}