Codeforces Round #324 (Div. 2)
CF的rating设置改了。。人太多了,决定开小号打,果然是明智的选择!
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10; const int INF = 0x3f3f3f3f; int main(void) { int n, t; scanf ("%d%d", &n, &t); if (t == 10) { if (n == 1) { puts ("-1"); } else { for (int i=1; i<n; ++i) printf ("1"); puts ("0"); } } else { for (int i=1; i<=n; ++i) { printf ("%d", t); } puts (""); } return 0; }
组合数学 B - Kolya and Tanya
题意:有一个3n的圈,每个数字可以在[1, 3]中选择,问ai + ai+n + ai+2n != 6的方案数
分析:3n个点,每个点都有3种选择,而出现ai + ai+n + ai+2n != 6的组合有7种,i的位置有n种,所以答案就是:(3 ^ (3 * n) - 7 ^ (n) + MOD) % MOD
还好猜猜样例一次过掉,否则一旦卡住就不会出后面的两题了
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int pow_mod(int x, int n, int p) { int ret = 1; while (n) { if (n & 1) { ret = 1ll * ret * x % p; } x = 1ll * x * x % p; n >>= 1; } return ret; } int main(void) { int n; scanf ("%d", &n); if (n == 1) { printf ("20\n"); } else printf ("%d\n", (pow_mod (3, n * 3, MOD) - pow_mod (7, n, MOD) + MOD) % MOD); return 0; }
题意:问是否有一个字符串和字符串a的不同个数与和字符串b的不同个数相同
分析:将a和b的字符比较,得到它们相同的个数以及不同的个数,不同的那块可以选择与它们都不同的或者与其中一个相同的,可以自由分配,相同的那块只能相同或都不同
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10; const int INF = 0x3f3f3f3f; char s[N], t[N]; char f(char a, char b) { if (a > b) swap (a, b); char r = a + 1; if (r == b) r++; if (r > 'z') r = 'a'; return r; } int main(void) { int n, m; scanf ("%d%d", &n, &m); scanf ("%s%s", s, t); int dif = 0; for (int i=0; i<n; ++i) { if (s[i] != t[i]) dif++; } int low = dif / 2; if (dif & 1) low++; if (low > m) puts ("-1"); else { if (m >= dif) { int sam = m - dif; for (int i=0; i<n; ++i) { if (s[i] == t[i]) { printf ("%c", sam > 0 ? f (s[i], t[i]) : s[i]); sam--; } else { printf ("%c", f (s[i], t[i])); } } puts (""); } else { int sam = (dif - m) * 2; for (int i=0; i<n; ++i) { if (s[i] == t[i]) { printf ("%c", s[i]); } else { if (sam <= 0) printf ("%c", f (s[i], t[i])); else printf ("%c", sam & 1 ? s[i] : t[i]); sam--; } } puts (""); } } return 0; }
题意:略
分析:一个或两个很好想,三个没什么好办法,用哥德巴赫猜想,只能暴力来~
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10; const int INF = 0x3f3f3f3f; /* 素性测试,在小范围(1e5)内判素数个数以及单个数判素数有奇效,不适用于大范围判素数 */ bool is_prime(int x) { if (x == 2 || x == 3) return true; if (x % 6 != 1 && x % 6 != 5) return false; for (int i=5; i*i<=x; i+=6) { if (x % i == 0 || x % (i + 2) == 0) return false; } return true; } int main(void) { int n; scanf ("%d", &n); if (is_prime (n)) { printf ("1\n%d\n", n); } else { int x = n - 2; if (is_prime (x)) { printf ("2\n%d %d\n", 2, x); } else { int k = n - 1; while (true) { if (is_prime (k)) break; k--; } n -= k; //n >= 9 int a = n / 2; while (a < n) { if (is_prime (a) && is_prime (n - a)) { printf ("3\n%d %d %d\n", k, a, n - a); return 0; } a++; } } } return 0; }
编译人生,运行世界!