首页 > 其他分享 >CF 1864 C

CF 1864 C

时间:2023-09-09 09:33:21浏览次数:30  
标签:cin int back CF 1864 xrightarrow ans push

C. Divisor Chain

看到样例2中的\(5\xrightarrow{-1}4\xrightarrow{-2}2\xrightarrow{-1}1\)想到了是不是应该把\(x\)向着\(2^n\)去凑,凑到了之后通过不断的减去\(2^{n-1}\)最后达到\(1\),然后就可以朝着这个方向去写。

通过不断枚举\(i\)(\(i =i*2\)),遇到取模不为零的情况时将\(x-i/2\),直到\(x=i\)。

也可以通过不断减去\(lowbit(x)\)的方式,直到\(lowbit(x)=x\)

这种方法通过观察二进制的性质,能让每一个出现的“除数”最多出现两次,从而过题。

代码

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;

const int N = 1010;
int t;
int x;


signed main()
{
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> t;
    while (t--)
    {
        cin >> x;
        vector<int> ans;
        ans.push_back(x);
        for(int i = 2;i < x;i <<= 1)
        {
            if(x % i)
            {
                x -= (i >> 1);
                ans.push_back(x);
            }
        }
        while(x > 1)
        {
            x /= 2;
            ans.push_back(x);
        }
        int si = ans.size();
        cout << si << endl;
        for(int i = 0;i < si;i++)
        {
            cout << ans[i] << " ";
        }
        cout << endl;
    }

    return 0;
}

标签:cin,int,back,CF,1864,xrightarrow,ans,push
From: https://www.cnblogs.com/tongluosao/p/17688921.html

相关文章

  • 【CF1527C】Sequence Pair Weight
    题目大意:给出一个长度为\(n(1\len\le10^{5})\)的序列\(a_1,a_2,...,a_n\),计算\(\sum_{1\lel<r\len}\sum_{l\lei<j\ler}[a_i=a_j]\)\(\sum_{1\lel<r\len}\sum_{l\lei<j\ler}[a_i=a_j]=\)\(\sum_{1\lei<j\len}[a_i=a_j]\timesi\t......
  • CF449E
    题目链接description给定整数\(n,m\leq10^6\)求以\((0,0)\)为左下角,\((n,m)\)为右上角构成的区域内每个格子被包含在的简单正方形(顶点都在区域内且在格点上的正方形)的数量之和。模大质数solution先考虑一个简单一些的问题。一个\(n\timesn\)的正方形,求所有四个顶点......
  • 【题解】CF1830A Copil Copac Draws Trees
    你考虑对于每一条边打上时间标记,然后在树上DFS的时候维护一下以\(u\)为根的答案即可,然后将答案合并,反正很简单,看代码就懂。code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+8;intt,n;structEdge{ intto,next,val;}edge[NN<<1];inthead[......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 【题解】CF1854D Michael and Hotel
    交互题。考虑题意即为找到\(1\)所在内向基环树上的所有点。我们考虑我们怎么找到环上的点,我们考虑我们可以\(O(\logn)\)询问到一个环上的点,方法即为将\(k\)定为一个大数,然后二分点集。然后我们便可以在\(O(n\logn)\)的时间复杂度内找到所有环上的点(我们一会儿再讲怎......
  • 【题解】CF1854C Expected Destruction
    你考虑,我们如果没有重合就将元素删去的操作,我们就有答案:\(n\times(m+1)-\sum\limits_{i=1}^na_i\)但是,我们显然最后的答案是小于这个的,如果有两个数在\(i\)相撞,那么我们的答案就会减少\((m-i+1)\)我们设\(f_{i,j}\)表示两个数分别在\(i\)和\(j\)的概率\((i\leqj......
  • 【题解】CF1854B Earn or Unlock
    你考虑,我们很容易地可以构造一个\(n^2\)的DP:\(f_{i,j}\)表示当前在\(i\)张牌,还可以摸\(j\)张牌的最大分数。转移也很好转移,你考虑一眼就会。但是我们显然要缩减复杂度,我们看到数据范围\(10^5\),想到了根号。分块???显然不行。莫队???都没有区间查询,怎么行呢?然后你苦思冥想......
  • CF613D 题解
    一、题目描述:给你一颗$n$个点的树,有$m$组询问。一个点如果被攻占,那么这个点就不能通行了。第$i$次询问给出$k_i$个关键点,关键点不能被攻占。求最少攻占多少个点可以使得关键点两两不连通。若不可能,输出$-1$。数据范围:$1\len,m\le1\times10^5......
  • 树莓派加挂实时时钟芯片PCF8563模块
    硬件:树莓派4B,PCF8563模块树莓派系统版本::~$lsb_release-aNoLSBmodulesareavailable.DistributorID:RaspbianDescription:RaspbianGNU/Linux10(buster)Release:10Codename:buster 在开始之前需要确认自己手里的芯片是PCF8563还是PCF8583,......
  • 【题解】CF1854A2 Dual (Hard Version)
    你考虑我们A1只需要通过自加凑一个最大的数,然后将所有的数都变成正数,最后做一次前缀和即可。(不懂可以看看落谷题解)好,我们现在去看HardVersion的\(31\)次操作怎么分配:前缀和(全为正)/后缀和(全为负)——\(19\)次还剩下\(12\)次,不知道该怎么做。我们的目标便变......