HRBU_20211011训练

A - Consecutive Sum Riddle

题意

从l到r求和为n,已知n,求l,r;因为-(n-1)+(n-1)=0+n=n;
所以输出(-n+1)和n即可

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        long long n;
        cin>>n;
        cout<<1-n<<" "<<n<<endl;
    }
}

B - Special Numbers

题意

以n次幂之和,顺序排列以求第几个数字是多少;
思路
把k化成二进制,再遍历二进制k,化成n进制即可;

代码

#include<stdio.h>
#include<iostream>
#define mod 1000000007
using namespace std;
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n,k;
        long long ans=0,a=1;
        cin>>n;
        cin>>k;
        for(long long int i=0;i<=31;i++)
        {
    
    
            if(((1<<i)&k)!=0)
            ans=(ans+a)%mod;
            a=a*n%mod;
        }
        cout<<ans<<endl;

    }
}

C - Make Them Equal

题意

把字符串里的字母全部转化为由C组成的字符串,只能把(i%x)!=0的位置转换,求最少的操作次数;分类讨论,当全部为c时,输出为0,否则分情况

代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;
void solve()
{
    
    
	int n; cin>>n;
	char c; cin>>c;
	string s; cin>>s;
	int f = 0;
	for(int i=0;i<n;i++)
		if(s[i] != c) f = 1;
	if(f == 0){
    
    cout<<"0"<<endl;return;}

	if(s[n-1] == c){
    
    cout<<"1\n"<<n<<endl;;return;}

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

	cout<<2<<endl<<n<<" ";
	for(int i=1;i<n;i++)
	{
    
    
		if(n%i != 0)
		{
    
    
			cout<<i<<endl;
			return;
		}
	}
}
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        solve();
    }
}

总结

希望下一次训练能够静下心来

猜你喜欢

转载自blog.csdn.net/MarigoldLi/article/details/120711668