[Codeforces] number theory (R1200) Part.3
题单:https://codeforces.com/problemset/page/6?tags=number%20theory,0-1200
660A. Co-prime Array
原题指路:https://codeforces.com/problemset/problem/660/A
题意
给定一个长度为 n ( 1 ≤ n ≤ 1000 ) n\ \ (1\leq n\leq 1000) n (1≤n≤1000)的序列 a 1 , ⋯ , a n ( 1 ≤ a i ≤ 1 e 9 ) a_1,\cdots,a_n\ \ (1\leq a_i\leq 1\mathrm{e}9) a1,⋯,an (1≤ai≤1e9).现有操作:在序列中任意位置插入一个 [ 1 , 1 e 9 ] [1,1\mathrm{e}9] [1,1e9]范围内的整数.问至少插入多少个元素可使得该序列中任意两元素互素,输出最少插入的元素个数和任一满足的序列.
思路
将数依次插入序列中,若该数与前一位的数不互素,插入一个 1 1 1即可.
代码
void solve() {
int n; cin >> n;
vi ans(1);
cin >> ans[0];
int last = ans[0];
for (int i = 1; i < n; i++) {
int a; cin >> a;
if (gcd(last, a) != 1) ans.push_back(1);
ans.push_back(a);
last = ans.back();
}
cout << ans.size() - n << endl;
for (auto i : ans) cout << i << ' ';
}
int main() {
solve();
}
664A. Complicated GCD
原题指路:https://codeforces.com/problemset/problem/664/A
题意
输入两整数 a , b ( 1 ≤ a ≤ b ≤ 1 e 100 ) a,b\ \ (1\leq a\leq b\leq 1\mathrm{e}100) a,b (1≤a≤b≤1e100),求一个最大的整数$d\ s.t.\ 对 对 对\forall x\in[a,b] , 有 ,有 ,有d\mid x$.
思路
显然当且仅当 a = b a=b a=b时答案非 1 1 1.
代码
void solve() {
string a, b; cin >> a >> b;
cout << (a == b ? a : "1");
}
int main() {
solve();
}
682A. Alyona and Numbers
原题指路:https://codeforces.com/problemset/problem/682/A
题意
给定两整数 n , m ( 1 ≤ n , m ≤ 1 e 6 ) n,m\ \ (1\leq n,m\leq 1\mathrm{e}6) n,m (1≤n,m≤1e6),求有多少对不同的整数对 ( x , y ) ( 1 ≤ x ≤ n , 1 ≤ y ≤ m ) s . t . 5 ∣ ( x + y ) (x,y)\ \ (1\leq x\leq n,1\leq y\leq m)\ s.t.\ 5\mid(x+y) (x,y) (1≤x≤n,1≤y≤m) s.t. 5∣(x+y).
思路
分别预处理出 [ 1 , n ] [1,n] [1,n]和 [ 1 , m ] [1,m] [1,m]中模 5 5 5的余数相同的数的个数,余 r ( 1 ≤ r ≤ 4 ) r\ \ (1\leq r\leq 4) r (1≤r≤4)与余 ( 5 − r ) (5-r) (5−r)的数的个数相乘即可.注意余 0 0 0的情况单独计算.
代码
void solve() {
int n, m; cin >> n >> m;
vi a[5], b[5];
for (int i = 1; i <= n; i++) a[i % 5].push_back(i);
for (int i = 1; i <= m; i++) b[i % 5].push_back(i);
ll ans = a[0].size() * b[0].size();
for (int i = 1; i < 5; i++) ans += a[i].size() * b[5 - i].size();
cout << ans;
}
int main() {
solve();
}
735B. Urbanization
原题指路:https://codeforces.com/problemset/problem/735/B
题意
将 n n n个数 a 1 , ⋯ , a n a_1,\cdots,a_n a1,⋯,an分为大小分别为 n 1 , n 2 n_1,n_2 n1,n2的两集合,使得两集合的元素的算术平均值之和最大,误差不超过 1 e − 6 1\mathrm{e}-6 1e−6.
第一行输入三个整数 n , n 1 , n 2 ( 1 ≤ n , n 1 , n 2 ≤ 1 e 5 , n 1 + n 2 ≤ n ) n,n_1,n_2\ \ (1\leq n,n_1,n_2\leq 1\mathrm{e}5,n_1+n_2\leq n) n,n1,n2 (1≤n,n1,n2≤1e5,n1+n2≤n).第二行输入 n n n个整数 a 1 , ⋯ , a n ( 1 ≤ a i ≤ 1 e 5 ) a_1,\cdots,a_n\ \ (1\leq a_i\leq 1\mathrm{e}5) a1,⋯,an (1≤ai≤1e5).
思路
显然应排序后选前 ( n 1 + n 2 ) (n_1+n_2) (n1+n2)大的元素.
①若 n 1 = n 2 n_1=n_2 n1=n2,则任意放.
②若 n 1 ≠ n 2 n_1\neq n_2 n1=n2,则将较大的元素放在较小的集合.
代码
void solve() {
int n, n1, n2; cin >> n >> n1 >> n2;
vi a(n);
for (int i = 0; i < n; i++) cin >> a[i];
sort(all(a), greater<int>());
if(n1 > n2) swap(n1, n2);
double sum = 0;
for (int i = 0; i < n1; i++) sum += a[i];
double ans = sum / n1;
sum = 0;
for (int i = n1; i < n1 + n2; i++) sum += a[i];
ans += sum / n2;
cout << fixed << setprecision(12) << ans;
}
int main() {
solve();
}
742A. Arpa’s hard exam and Mehrdad’s naive cheat
原题指路:https://codeforces.com/problemset/problem/742/A
题意
输入一个整数 n ( 0 ≤ n ≤ 1 e 9 ) n\ \ (0\leq n\leq 1\mathrm{e}9) n (0≤n≤1e9),求 137 8 n 1378^n 1378n的末位数.
思路
显然只需考察 8 n 8^n 8n的末位数, 8 1 m o d 10 = 8 , 8 2 m o d 10 = 4 , 8 3 m o d 10 = 2 , 8 4 m o d 10 = 6 , 8 5 m o d 10 = 8 8^1\ \mathrm{mod}\ 10=8,8^2\ \mathrm{mod}\ 10=4,8^3\ \mathrm{mod}\ 10=2,8^4\ \mathrm{mod}\ 10=6,8^5\ \mathrm{mod}\ 10=8 81 mod 10=8,82 mod 10=4,83 mod 10=2,84 mod 10=6,85 mod 10=8,故只需考察 n % 4 n\%4 n%4即可.注意特判 n = 0 n=0 n=0的情况.
代码
void solve() {
int n; cin >> n;
if (n == 0) {
cout << 1;
return;
}
int ans = 0;
switch (n % 4) {
case 0: ans = 6; break;
case 1: ans = 8; break;
case 2: ans = 4; break;
case 3: ans = 2; break;
}
cout << ans;
}
int main() {
solve();
}
749A. Bachgold Problem
原题指路:https://codeforces.com/problemset/problem/749/A
题意
输入一个整数 n ( 2 ≤ n ≤ 1 e 5 ) n\ \ (2\leq n\leq 1\mathrm{e}5) n (2≤n≤1e5),将其表示为尽量多个素数之和.第一行输出素数的个数,第二行输出用到的素数.
思路
显然拆成若干个 2 2 2和若干个 3 3 3之和个数最多.
代码
void solve() {
int n; cin >> n;
cout << n / 2 << endl;
if (n & 1) {
for (int i = 0; i < n / 2 - 1; i++) cout << 2 << ' ';
cout << 3;
}
else
for (int i = 0; i < n / 2; i++) cout << 2 << ' ';
}
int main() {
solve();
}
755A. PolandBall and Hypothesis
原题指路:https://codeforces.com/problemset/problem/755/A
题意 ( 2 s 2\ \mathrm{s} 2 s)
给定一个整数 n ( 1 ≤ n ≤ 1000 ) n\ \ (1\leq n\leq 1000) n (1≤n≤1000),求一个正整数 m s . t . n m + 1 m\ s.t.\ nm+1 m s.t. nm+1是合数.
思路
注意到 n ( n − 2 ) + 1 = ( n − 1 ) 2 n(n-2)+1=(n-1)^2 n(n−2)+1=(n−1)2,故 n > 2 n>2 n>2时输出 ( n − 2 ) (n-2) (n−2)即可.注意特判 n ≤ 2 n\leq 2 n≤2的情况.
代码
void solve() {
int n; cin >> n;
if (n == 1) cout << 3;
else if (n == 2) cout << 4;
else cout << n - 2;
}
int main() {
solve();
}
758B. Blown Garland
原题指路:https://codeforces.com/problemset/problem/758/B
题意
用’R’、‘B’、‘Y’、‘G’、'!‘分别表示红色、蓝色、黄色、绿色的灯泡和坏掉的灯泡.有一个灯泡序列,要求任意连续 4 4 4个灯泡的颜色不同.给定一个包含上述字符的字符串 s ( 4 ≤ ∣ s ∣ ≤ 100 ) s\ \ (4\leq |s|\leq 100) s (4≤∣s∣≤100)描述一个灯泡的序列,分别输出’!'中每种颜色的灯泡的个数.数据保证 s s s是合法序列,且其中每种颜色的灯泡都至少出现一次.
思路
注意到连续 4 4 4个灯泡颜色不同,而颜色只有 4 4 4种,故第 i ( i ≥ 0 ) i\ \ (i\geq 0) i (i≥0)个灯泡与第 ( i + 4 ) (i+4) (i+4)个灯泡的颜色相同.预处理出 s s s中下标模 4 4 4下的余数对应的字符,因 s s s中每种颜色的灯泡都至少出现一次,故可分辨出每个余数对应的颜色,统计个数即可.
代码
void solve() {
string str; cin >> str;
multiset<char> s[4];
for (int i = 0; i < str.length(); i++) s[i % 4].insert(str[i]);
int R = 0, B = 0, Y = 0, G = 0;
for (int i = 0; i < 4; i++) {
if (s[i].count('R')) R = s[i].size() - s[i].count('R');
else if (s[i].count('B')) B = s[i].size() - s[i].count('B');
else if (s[i].count('Y')) Y = s[i].size() - s[i].count('Y');
else if (s[i].count('G')) G = s[i].size() - s[i].count('G');
}
cout << R << ' ' << B << ' ' << Y << ' ' << G;
}
int main() {
solve();
}
766B. Mahmoud and a Triangle
原题指路:https://codeforces.com/problemset/problem/766/B
题意
给定 n ( 3 ≤ n ≤ 1 e 5 ) n\ \ (3\leq n\leq 1\mathrm{e}5) n (3≤n≤1e5)个整数 a 1 , ⋯ , a n ( 1 ≤ a i ≤ 1 e 9 ) a_1,\cdots,a_n\ \ (1\leq a_i\leq 1\mathrm{e}9) a1,⋯,an (1≤ai≤1e9),问能否从中取 3 3 3个数作为一个非退化三角形的边长,若能,则输出"YES";否则输出"NO".
思路
将序列排序后每次检查相邻三个元素即可.
代码
void solve() {
int n; cin >> n;
vi a(n);
for (int i = 0; i < n; i++) cin >> a[i];
sort(all(a));
for (int i = 1; i < n -1; i++) {
if(a[i - 1] + a[i] > a[i + 1]) {
cout << "YES";
return;
}
}
cout << "NO";
}
int main() {
solve();
}
786B. Sherlock and his girlfriend
原题指路:https://codeforces.com/problemset/problem/776/B
题意
有编号 1 ∼ n 1\sim n 1∼n的 n n n个物品,其中第 i i i个物品的价值为 ( i + 1 ) (i+1) (i+1).现要对物品染色,要求若一个物品的价格是另一物品的素因子,则这两个物品不同色.问至少需要几种颜色,并给出一个染色序列.
第一行输入一个整数 n ( 1 ≤ n ≤ 1 e 5 ) n\ \ (1\leq n\leq 1\mathrm{e}5) n (1≤n≤1e5).
第一行输出一个整数 k k k,表示用到的颜色个数.第二行输出 k k k个整数表示一个染色序列,每种颜色用 [ 1 , k ] [1,k] [1,k]中的一个整数表示.
思路
n = 1 n=1 n=1时,显然只需 1 1 1种颜色. n = 2 n=2 n=2时,只需 2 2 2种颜色,即素数染一种颜色,素数的倍数染另一种颜色.
代码
const int MAXN = 1e5 + 5;
bool state[MAXN];
void solve() {
int n; cin >> n;
for (int i = 2; i <= n + 1; i++) {
if(!state[i])
for (int j = 2 * i; j <= n + 1; j += i) state[j] = true;
}
cout << (n > 2 ? 2 : 1) << endl;
for (int i = 2; i <= n + 1; i++) cout << (state[i] ? 2 : 1) << ' ';
}
int main() {
solve();
}