CF1562 // 2021.9.5

本文档介绍了三道编程题目:CF1562A中寻找模运算最大值,CF1562B删除字符使数变合数,以及Rings问题的解决方案。通过实例展示了如何利用编程技巧解决数论和优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CF1562A The Miracle and the Sleeper

题面

对给定区间 l,r,≤ 10^91≤l≤r≤109 求区间内的两个数 a,b,b \le ab≤a 使得a mod b的值最大,并输出这个值。

输入一行一个数 t,t\le10^4t≤104表示样例个数。接下来 t 行,每行两个数 l、r,表示一次询问。 输出分 t 行表示每个询问的答案。

code

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    int n, l, r;//一个数d被取模可被保留的最大值为d % ((d >> + 1) + 1)
    
    int main(){
    	scanf("%d",&n);
    
    	while(n--)
    	{
    		scanf("%d%d", &l, &r);
    		
    		if(l == r)  cout << 0 << endl;
             
            else
            {
                int d = r - l;
                if(l <= (r >> 1) + 1)  cout << r % ((r >> 1) + 1) << endl;//如果这个数的最小值小于可选择的最优取模解时,直接输出这个的取模的解即可。
    
                else    cout << r - l << endl;//如果这个的结果较小的话,那么可以直接输出l - r;
            }
    	}
        return 0;
    }

CF1562B Scenes From a Memory

题面

大致题意

给出一个正整数n 中不包含 00。求最大删去多少位使其变成一个合数或 1。数据保证一定存在答案。

素数是指除 1 和它本身外没有除数的数。合数是指一个有两个以上除数的数。1 既不是质数也不是合数。

code

    #include <bits/stdc++.h>
    using namespace std;
    
    int T, k;
    string s;
    bool isPrime[100];
    bool check(int x){//预处理100一类的所有素数
    	if (x < 2)return false;
    	for (int i = 2; i * i <= x; ++i){
    		if (x % i == 0)return false;
    	}
    	return true;
    }
    void pre_work(){
    	for (int i = 2; i <= 99; ++i) isPrime[i] = check(i);
    }
    void solve(){//如果数中含有1,4 6, 8, 9这样的数时就可以直接删除到这最后一个数
    	for (int i = 0; i < s.size(); ++i){
    		if (s[i] == '1' || s[i] == '4' || s[i] == '6' || s[i] == '8' || s[i] == '9'){
    			cout << "1\n";
    			cout << s[i] << endl;
    			return;	
    		}
    	}
    	for (int i = 0; i < s.size(); ++i){//如果不满足这两种条件的话可以两两判断是否为素数,存在的话就直接的输出。(因为数据保证了一定存在答案)
    		for (int j = i + 1; j < s.size(); ++j){
    			int cur = (s[i] - '0') * 10 + (s[j] - '0');
    			if (!isPrime[cur]){
    				cout << "2\n";
    				cout << cur << endl;
    				return;
    			}
    		}
    	}
    	return;
    }
    int main(){
    	std::ios::sync_with_stdio(false);
    	cin >> T;
    	pre_work();
    	while (T--){
    		cin >> k >> s;
    		solve();
    	}
    	return 0;
    }

Rings

题意
在这里插入图片描述

code

    #include <cstdio>
    int t, n;
    char s[20003];
    int main() {
        scanf("%d", &t);
        while (t--) {
            scanf("%d%s", &n, s + 1);
            bool ok = 0;//0表示符合情况4
            for (int i = 1; i <= n; i++)
                if (s[i] == '0'){
                    ok = 1;
                    if (i > (n >> 1))//此时[1,i-1]长度大于等于[n/2]
                        printf("1 %d 1 %d\n", i, i - 1);
                    else//否则[i+1,n]长度大于等于[n/2]
                        printf("%d %d %d %d\n", i, n, i + 1, n);
                    break;
                }
            if (!ok)//此时两个子串[1,n-1],[2,n]长度相同,且数值一样
                printf("1 %d 2 %d\n", n - 1, n);
        }
        return 0;
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜狗原来是我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值