codeforces round#747div2

本文档涵盖三个不同编程题目,涉及字符串长度判断、幂次转换计数和字符修改步数计算。第一部分讲解如何快速找到满足和等于给定数值的区间;第二部分介绍将十进制数转化为二进制幂次表示的方法;第三部分讨论如何在字符串中最小步数统一字符。这些技巧在算法竞赛和实际开发中有广泛应用。
摘要由CSDN通过智能技术生成

A

题目链接

题意

给出n,要你找出L,R,满足L+(L+1)+······+(R-1)+R=n.

思路

直接-n+1, n,因为-n+1到n-1的和抵消了为0,只剩下了n
(注意观察样例)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<-n+1<<" "<<n<<endl;
    }
    return 0;
}

B

题目链接

题意

在这里插入图片描述

思路

每一个幂次只能取1个或0个,且底数大于2,
在这里插入图片描述
因此,将k转化为二进制,然后再加上每一位为1的幂次

include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int main()
{
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        ll res=1;
        ll ans=0;
        for(int i=0;i<32;++i)
        {
            if(k&1){ans=(ans+res)%mod;}
            res*=n%mod;
            k>>=1;
        }
        cout<<ans<<endl;
    }
    return 0;
}



C

题目链接

题意

给字符串的长度和一个字符c,问你最少要多少步才能将字符串所有与c不同的元素改成和c相同,还有一点就是,你要选择一个x,(1<=x<=n),只有不是能被x整除的位置才能改变

思路

听起来有点复杂,其实只要考虑3种情况即可
第1种就是,本身全是c,不用变,0
第2种情况就是,用x=n,对于1~n-1位置上的字符都可以变成c
第3种情况就是,用x=n-1,n一定无法整除n-1,一定可以把第n个位置的字符变成c

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+100;
char s[N];
int main()
{
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        char c;
        cin>>n>>c;
        for(int i=1;i<=n;++i)cin>>s[i];
        bool f=true;
        for(int i=1;i<=n;++i)if(s[i]!=c)
        {
            f=false;
            break;
        }
        if(f)
        {
            cout<<"0\n";
            continue;
        }
 
        for(int i=1;i<=n;++i)
        {
            bool flag=true;
            for(int j=i;j<=n;j+=i)if(s[j]!=c)
            {
                flag=false;
                break;
            }
            if(flag)
            {
                f=true;
                cout<<"1\n"<<i<<"\n";
                break;
            }
        }
        if(!f)cout<<2<<endl<<n-1<<" "<<n<<endl;
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值