Codeforces Round #747
A - Consecutive Sum Riddle
题意
给一个数n 求出l,r 使l到r所有数的累和等于n的
思路
给出-(n-1)和n 负数和绝对值恰好是正数和-n
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,t,q,l,r;
string s;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n;
cout<<-n+1<<" "<<n<<endl;
}
return 0;
}
B - Special Numbers
题意
给一个数字n 要求组成的数字要求只能是n的不同次方组成,求这些数字中第k大个
思路
1 n^0 相当于二进制 1
2 n^1 相当于二进制 10
3 n^1 +n^0 相当于二进制 11
4 n^2 相当于二进制 100
5 n^2 +n^0 相当于二进制 101
6 n^2 +n^1 相当于二进制 110
第k大相当于二进制进位 所以用2进制转化k 把n的多少次方当作二进制 然后用二进制的k去计算答案
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 300005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,t,q,l,r,k;
vector<int> ve;
string s;
char c;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n>>k;
ll ret=0,base=1;
for(ll i=0;i<64;i++)
{
if(k&(1ll<<i))
{
ret=(ret+base)%mod;
}
base=(base*n)%mod;
}
cout<<ret<<endl;
}
return 0;
}
C - Make Them Equal
题意
给定一个字符串和一个字符c,选择一个下标x只有当下标i(从1开始)不能被x整除时,s[i]可以变成c,求最小操作次数
思路
1.全都是c输出0
2.在s串的后半段去找一个等于c的位置为x 后半段的所有数字都没有他的倍数(2倍) 所以其他数字都不能被这个x整除
3.当后半段全不为c
此时按照2的取法 必然会剩一个s[x] 所以需要两个
或者 去前半段的数字作为x 此时必有一个后半段的数能被x整除 也需要两个
综上 这种情况必须要两个
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 300005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,t,q,l,r,k;
vector<int> ve;
string s;
char c;
int main()
{
ios::sync_with_stdio(false);
enes();
cin>>t;
while(t--)
{
cin>>n>>c;
cin>>s;
int flag=0,cnt=0;
for(int i=0;i<n;i++)
{
if(s[i]==c)
{
cnt++;
if(i+1>n/2)
{
flag=i+1;
}
}
}
if(cnt==n)
cout<<0<<endl;
else if(flag)
{
cout<<1<<endl<<flag<<endl;
}
else
{
cout<<2<<endl;
cout<<n-1<<" "<<n<<endl;
}
}
return 0;
}
D - The Number of Imposters
题意
有n个人,m条指控,每个人都是骗子或好人,好人的指控都是正确的,骗子的指控都是错误的,问最多多少个骗子。
思路
代码
E1 - Rubik’s Cube Coloring (easy version)
题意
给定一颗高k的满二叉树,有六种颜色,相邻节点的颜色必须满足魔方上相邻的颜色,问染色方案数。
思路
代码