Codeforces Round #747(Div.2)

本文探讨了三个问题:A-ConsecutiveSumRiddle通过连续区间和计算实现整数目标,B-SpecialNumbers关注二进制转换与幂底数序列的第K个数,C-MakeThemEqual涉及字符替换操作以使字符串元素统一。展示了对应的AC代码解决方案和关键思路。
摘要由CSDN通过智能技术生成

A - Consecutive Sum Riddle

题意:给定一个整数 n(1<= n<=10^{18}),求一个区间[l,r]满足:
-10^{18} \leq l < r \leq 10 ^{18}

l+(l+1)+(l+2)...(r-1)+r==n

思路:

n==-(n-1)+(-(n-2))+...0+1+....n

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        //l*(r-l)+(r-l)*(r-l-1)/2==n
        cout<<-(n-1)<<" "<<n<<endl;
    }
}

B - Special Numbers

题意:

 对于给定的n(n是某个数的幂底),幂底数的累加和形成一个递增序列,求第K个数是什么?

例:当n=3,k=4时,递增序列为:{1,3,4,9,10,12,27........},答案是9。

思路:

二进制转换成十进制:2^{5}  2^{4}  2^{3}  2^{2}  2^{1}  2^{0}

                                   1    0    1    1    0    1

                        \Leftrightarrow 1*2^{5}+0*2^{4}+1*2^{3}+1*2^{2}+0*2^{1}+1*2^{0}

本题:十进制转换成二进制,不过权值是n的幂,不是2的幂啦!

                                     n^{3}   n^{2}   n^{1}     n^{0}

                                    1       0      1     1 

                        \Leftrightarrow 1*n^3+0*n^2+1*n^1+1*n^0

                  下图第一列是递增序列顺序排列:n^{k}>n^1+n^2+...+n^{k-1}

n^3n^2n^1n^0K
n^{0}00011
n^100102
n^0+n^100113
n^201004
n^2+n^001015
n^2+n^101106
n^2+n^1+n^001117
n^{3}10008
n^3+n^010019
n^3+n^1101010
n^3+n^1+n^0101111
n^3+n^2110012
n^3+n^2+n^0110113
n^3+n^2+n^1111014
n^3+n^2+n^1+n^0111115

给你一个K,将它转换成二进制形式,那么我们就知道谁是0,谁是1。将其按照n的幂的权转换成十进制。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod =1e9+7;
int main()
{
	int t;
    ll n,k;
	cin>>t;
	while(t--)
    {
		vector<int>a;
		ll ans=0;
		cin>>n>>k;
        while(k)
        {
            a.push_back(k%2);
            k/=2;
        }
        ll x=1;
        for(int i=0;i<a.size();i++)
        {
            //(n,i)

            if(a[i]==1)
            {
                ans=(ans+x)%mod;
            }
            x=x*n%mod;
        }
        cout<<ans<<endl;
	}
	return 0;
}

C - Make Them Equal

题意:给你一个字符串S和一个字符C,进行最少的操作使S 中每个字符等于C

操作:选择一个数字x(1\leq x\leq n),对于每个位置i,只要i不能被x整除,用C替换S_{i}

 输出最小的操作数及选择的x

样例解释:

4 b
bzyx
2 
2 3

思路:

三种情况:当S中的每个字符都等于C,则不需要操作;在1~n内选一个除数,那么肯定是越大越好。比如选x,显然比x小的数是不可能整除x的,所以1到n-1内的数就全被变成C了.然后最多再选一个不是x的因子的数就能把第n个数变成C了。因此,最多选两个数即可完成要求(n和n-1肯定互质).

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod =1e9+7;
const int maxx=3e5+10;
char s[maxx];
int main()
{
	int t,n;
	char c;
	cin>>t;
    while(t--)
    {
        cin>>n>>c;
        scanf("%s",s+1);
        bool f=true;
        for(int i=1;i<=n;i++)
        {
            if(s[i]!=c)
            {
                f=false;
                break;
            }
        }
        if(f)
        {
            cout<<"0"<<endl;
            continue;
        }

        for(int i=1;i<=n;i++)
        {
            f=true;
            for(int j=i;j<=n;j+=i)
            {
                if(s[j]!=c)
                {
                    f=false;
                    break;
                }
            }
            if(f==true)
            {
                cout<<"1"<<endl<<i<<endl;
                break;
            }
        }
        if(f==false)
        {
            cout<<"2"<<endl;
            cout<<n-1<<" "<<n<<endl;
        }
    }
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值