Codeforces Round #747(div2) a-c

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的满二叉树,有六种颜色,相邻节点的颜色必须满足魔方上相邻的颜色,问染色方案数。

思路

代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值