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();
}
}
总结
希望下一次训练能够静下心来