A. Olesya and Rodion
题目链接:
codeforces 584A. Olesya and Rodion
题目描述:
给出n, t, 问是否存在一个n位数能被t整除,能的话输出这个数,否则输出-1. 题目太水,加上题目描述是为了确保此题是此题,此题非彼题(看的是同一个题目)
解题思路:
当n=1,t=10时输出-1,其他时候先输出一个t,然后其他剩余的位置用0填补。
题目代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main () 5 { 6 int n, t; 7 while (scanf ("%d %d", &n, &t) != EOF) 8 { 9 if (n == 1 && t == 10) 10 { 11 printf ("-1 "); 12 continue; 13 } 14 if (t == 10) 15 n --; 16 printf ("%d", t); 17 while (-- n) 18 printf ("0"); 19 printf (" "); 20 } 21 return 0; 22 }
B. Kolya and Tanya
题目链接:
codeforces 584 B. Kolya and Tanya
题目描述:
有一个圆环,圆环上有3*n个点,三个点组成一个正三角形。每个点上可以放1, 2 or 3个金币,n个正三角形里的金币总数不能同时等于6。问有多少种摆放方案?
解题思路:
每个正三角形有3^3种摆放方式,其中7种方式不合法,那么当有n个正三角形的时候,方案数就为27^n - 7^n.
题目代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef __int64 LL; 5 const LL mod = 1000000007; 6 int main () 7 { 8 LL n, a, b; 9 scanf("%I64d", &n); 10 a = 27; b = 7; 11 while (-- n) 12 { 13 a = (a * 27) % mod; 14 b = (b * 7) % mod; 15 } 16 printf ("%I64d ", (a - b + mod) % mod); 17 return 0; 18 }
C. Marina and Vasya
题目链接:
codeforces 584 C. Marina and Vasya
题目描述:
给出长度都为n的字符串a, b, 输出一个新构造出的串s,存在s[i] == a[i] 的数目与 s[j] == b[j]的数目都等于k。不能构造出这样的新串s,输出-1.
解题思路:
怎么构造都可以,题目也是比较水的。扎扎的构造方式是:先把s串置成空,然后把a[i] == b[i]的位置选择前k位放置到s[i]里面。a[i] == b[i]的数目k'小于k的话,找前 k - k' 个 s[i] 为空的位置,使得a[i] == s[i], b字符串同理,然后把s串中当前还是空的位置,赋为!a也!b的字母。如果构造不成功就输出-1即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef __int64 LL; 5 const LL maxn = 100010; 6 7 int main () 8 { 9 int n, t; 10 char a1[maxn], a2[maxn], ans[maxn]; 11 12 while (scanf ("%d %d", &n, &t) != EOF) 13 { 14 scanf ("%s %s", a1, a2); 15 memset (ans, 0, sizeof(ans)); 16 t = n - t; 17 18 for (int i=0; i<n; i++) 19 { 20 if (!t) 21 break; 22 if (a1[i] == a2[i]) 23 { 24 ans[i] = a1[i]; 25 t --; 26 } 27 } 28 int resa1 = t; 29 for (int i=0; i<n; i++) 30 { 31 if ( !resa1 ) 32 break; 33 if (!ans[i]) 34 { 35 ans[i] = a1[i]; 36 resa1 --; 37 } 38 } 39 40 int resa2 = t; 41 for (int i=0; i<n; i++) 42 { 43 if ( !resa2 ) 44 break; 45 if (!ans[i]) 46 { 47 ans[i] = a2[i]; 48 resa2 --; 49 } 50 } 51 52 for (int i=0; i<n; i++) 53 if ( !ans[i] ) 54 { 55 if (a1[i]!='a' && a2[i]!='a') 56 ans[i] = 'a'; 57 else if (a1[i]!='b' && a2[i]!='b') 58 ans[i] ='b'; 59 else 60 ans[i] = 'c'; 61 } 62 63 if (resa1 || resa2) 64 printf("-1 "); 65 else 66 puts (ans); 67 68 } 69 return 0; 70 }
D. Dima and Lisa
题目链接:
codeforces 584 D. Dima and Lisa
题目描述:
一个数,问是否可以由小于等于3个素数相加得出?可以输出素数的值,否则输出-1.
解题思路:
额!这个题目是我胡搞的,我先找出一个小于n但是距离n最近的素数x。由于n和x都是奇数,辣么n-x肯定是偶数咯,然后就拆分n-x,如果n-x可以拆成两个素数就输出这些素数,否则输出-1。写一发,测试实力过了,然后提交,心好虚!但是竟然过了,对的没错就是过了。事后听大家讨论题目好像有什么定理,然后找之。
哥德巴赫猜想:任何大于2的偶数都可以用两个素数和来表示。扩展:任何大于5的奇数都可以用三个素数的和来表示。(n-x肯定可以表示为两个素数的和或者是2咯)
题目代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 500; 4 int mark[maxn], isprime[maxn]; 5 6 void init () 7 { 8 int i, j; 9 mark[0] = mark[1] = 1; 10 for (i=2; i<=maxn; i++) 11 for (j=i+i; j<maxn; j+=i) 12 mark[j] = 1; 13 } 14 15 int main () 16 { 17 int n; 18 init(); 19 20 while (scanf ("%d", &n) != EOF) 21 { 22 int i, a, b, c, m; 23 24 for (a=n; ; a--) 25 { 26 if (a == n - 1) 27 continue; 28 m = (int)sqrt (a); 29 30 for (i=2; i<=m; i++) 31 if (a%i == 0) 32 break; 33 34 if (i > m) 35 break; 36 37 } 38 if (a == n) 39 printf ("%d %d ", 1, n); 40 else if (a == n - 2) 41 printf ("%d %d %d ", 2, 2, n-2); 42 else 43 { 44 int m = n - a; 45 for (i=2; i<=m-i; i++) 46 { 47 if (!mark[i] && !mark[m-i]) 48 { 49 c = i; 50 b = m - i; 51 break; 52 } 53 } 54 55 printf("%d %d %d %d ", 3, c, b, a); 56 } 57 } 58 return 0; 59 }
E. Anton and Ira
题目链接:
codeforces 584 E. Anton and Ira
题目描述:
给出两个长度都为n的序列a, b。两个序列中的数字都是[1, n]。现在可以交换a中的任意两个元素(a[i], a[j]),交换价值为|i - j|,问最小的交换价值为多少?可以使得strcmp(a, b) == 0.
解题思路:
其实这个题目就是需要向前换与需要向后换的数互换,为了保证最优,交换(a[i], a[j])的时候posb[a[i]]<=j && posb[a[j]]>=i.
交换的次数还是很多的,结构体数组保存一直WA 14,最后突然醒悟,发现数组开小了........下次遇到不确定大小的数组保证开STL。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 2010; 8 int a[maxn], b[maxn], posb[maxn]; 9 struct node 10 { 11 int x, y; 12 node (int a = 0, int b = 0):x(a),y(b) {} 13 } p[10000000]; 14 15 int main () 16 { 17 int n; 18 while (scanf ("%d", &n) != EOF) 19 { 20 for (int i=1; i<=n; i++) 21 scanf ("%d", &a[i]); 22 for (int i=1; i<=n; i++) 23 { 24 scanf ("%d", &b[i]); 25 posb[b[i]] = i; 26 } 27 28 int res, nu; 29 res = nu = 0; 30 for (int i=1; i<=n; i++) 31 { 32 int x = i; 33 for (int j=i-1; j>0; j--) 34 { 35 if (posb[a[j]]>=x && posb[a[x]]<=j) 36 { 37 swap (a[x], a[j]); 38 res += abs (x - j); 39 p[nu ++] = node(x, j); 40 x = j; 41 } 42 } 43 } 44 45 printf ("%d %d ", res, nu); 46 for (int i=0; i<nu; i++) 47 printf ("%d %d ", p[i].x, p[i].y); 48 } 49 return 0; 50 }