[Codeforces] number theory (R1200) Part.3

[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  (1n1000)的序列 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  (1ai1e9).现有操作:在序列中任意位置插入一个 [ 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  (1ab1e100),求一个最大的整数$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  (1n,m1e6),求有多少对不同的整数对 ( 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)  (1xn,1ym) 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  (1r4)与余 ( 5 − r ) (5-r) (5r)的数的个数相乘即可.注意余 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 1e6.

第一行输入三个整数 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  (1n,n1,n21e5,n1+n2n).第二行输入 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  (1ai1e5).

思路

显然应排序后选前 ( 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  (0n1e9),求 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  (2n1e5),将其表示为尽量多个素数之和.第一行输出素数的个数,第二行输出用到的素数.

思路

显然拆成若干个 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  (1n1000),求一个正整数 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(n2)+1=(n1)2,故 n > 2 n>2 n>2时输出 ( n − 2 ) (n-2) (n2)即可.注意特判 n ≤ 2 n\leq 2 n2的情况.

代码

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  (4s100)描述一个灯泡的序列,分别输出’!'中每种颜色的灯泡的个数.数据保证 s s s是合法序列,且其中每种颜色的灯泡都至少出现一次.

思路

注意到连续 4 4 4个灯泡颜色不同,而颜色只有 4 4 4种,故第 i    ( i ≥ 0 ) i\ \ (i\geq 0) i  (i0)个灯泡与第 ( 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  (3n1e5)个整数 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  (1ai1e9),问能否从中取 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 1n 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  (1n1e5).

第一行输出一个整数 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();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值