Codeforces Round #324 (Div. 2)

CF的rating设置改了。。人太多了,决定开小号打,果然是明智的选择!

 

水 A - Olesya and Rodion

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

  

构造 C - Marina and Vasya

题意:问是否有一个字符串和字符串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;
}

  

素数 D - Dima and Lisa

题意:略

分析:一个或两个很好想,三个没什么好办法,用哥德巴赫猜想,只能暴力来~

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

  

 

posted @ 2015-10-08 16:53  Running_Time  阅读(239)  评论(0编辑  收藏  举报