首页 > 其他分享 >CF1325D(异或构造)1700

CF1325D(异或构造)1700

时间:2023-05-04 16:47:36浏览次数:53  
标签:1700 CF1325D return int res infa 异或 mod define

原题链接

题目大意:
给定整数 u 和 v (0\(\leq\)u,v\(\leq\)\(10^{18}\) )试构造长度最短的数组,使得数组内所有元素的异或和为 u,加和为 v。
如果有解,输出两行,第一行输出一个整数 n,第二行输出 n 个非负整数,表示数组里的元素。多解输出任意一组即可。如果无解,输出一行一个整数 −1。

思路:

关于异或的一些性质
根据性质3和4,我们很容易得到

  • u > v
  • u 和 v 的奇偶性不一致

时,无解;
令d = v - u
if (d % 2 == 0), 根据性质1和2,我们很容易得到一组通解{u, \(\frac{d}{2}\), \(\frac{d}{2}\)};
因为序列要最短,所以需要判断一下{ u,d } 和 {u + \(\frac{d}{2}\), \(\frac{d}{2}\)} 符不符合条件;
if (d % 2 != 0), 则无解。
特殊的:若 u == v 则直接输出 u

AC代码

点击查看代码
#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
#define xx first
#define yy second
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
#define fixed fixed<<setprecision
#define endl '\n'
#define int long long
#define ll long long
#define pb push_back
#define db double
#define inf 0x3f3f3f3f
#define PII pair<int,int>
#define mem(x,y) memset(x,y,sizeof(x));
#define vi vector<int>
#define alls(x) x.begin(),x.end()
#define maxv *max_element
#define minv *min_element
#define NO cout << "NO" << '\n';
#define YES cout << "YES" << '\n';
#define rep(i,x,y) for(int i = (x); i <= (y); i ++)
#define dec(i,y,x) for(int i = (y); i >= (x); i --)
using namespace std;
priority_queue<int> pq;
priority_queue<int, vector<int>, greater<int> > up;
//---------------------------------------------------
int qmi(int a, int k, int p){ int res = 1 % p; while (k){ if (k & 1) res = res * a % p;
        a = a * a % p;k >>= 1;} return res;}
int ksm(int a, int k){ int res = 1; while (k){ if (k & 1) res = res * a;
        a = a * a;k >>= 1;} return res;}
//----------------------------------------------------
const int N1 = 1e6 + 10, mod = 1e9 + 7;

int fa[N1], infa[N1];
void initcp(int n){ fa[0] = infa[0] = 1; for (int i = 1; i < n; i ++ ) {
        fa[i] = fa[i-1] * i % mod; infa[i] = infa[i-1] * qmi(i, mod - 2, mod) % mod;}}
int C(int a, int b){ if(a < b) return 0; return fa[a] * infa[a-b] % mod * infa[b] % mod;}
int CL(int a,int b){ if(a < b) return 0; int down = 1, up = 1; 
    for(int i = a, j = 1; j <= b; i -- ,j ++){ up = up * i % mod; down = down * j % mod;}
    return up * qmi(down, mod-2, mod) % mod; }    
int Lucas(int a, int b){ if(a < mod && b < mod) return C(a,b);
    return Lucas(a/mod, b/mod) * C(a % mod, b % mod) % mod;}
int P(int a, int b){ if(a < b) return 0; return fa[a] * infa[a-b] % mod;}
/*-----------------------------------------------------------*/
const int N2 = 1e6 + 10;

int cntt, primes[N2];
bool stt[N2];
void initpr(int n){ for(int i = 2; i <= n; i ++){ if(!stt[i]) primes[cntt ++] = i;
        for(int j = 0; primes[j] * i <= n; j ++){ stt[primes[j] * i] = true;
            if(i % primes[j] == 0) break;} } }
int gcd(int a, int b){return b ? gcd(b, a % b) : a;}
// 返回末尾的1
int lowbit(int x){ return x & -x; }
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
//int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
//int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
/*----------------------------------------------------------*/

const int N = 1e6 + 10;
int a[N];
int n,m;

void solve()
{
    cin >> n >> m;
    if(n > m) {
        cout << -1 << endl; return;
    }
    int aa = n % 2, bb = m % 2;
    if(aa != bb)
    {
        cout << -1 << endl; return;
    }
    if(m == 0 && n == 0)
    {
        cout << 0 << endl; return;
    }
    int cc = m - n;
    if(cc == 0)
    {
        cout << "1\n" <<  m << endl;
    }
    else if(cc % 2 == 0)
    {
        int d = cc / 2;
        if( ((d + n)^d) == n)
        {
            cout << "2\n" << d+n << " " << d << endl;
        }
        else if( (cc^n) == n)
        {
            cout << "2\n" << n << " " << cc << endl;
        }
        else 
        {
            cout << 3 << endl;
            cout << n << " " << d << " " << d;
        }
    }
    else
    {
        cout << -1 << endl;
    }
}

signed main()
{
    IOS
    initcp(1010);
    initpr(1010);
    int asd = Lucas(110,12);
    int sdf = CL(1010,120);
    int dfg = ksm(34,9);
    int T = 1;
    //cin >> T;
    while(T --)
    {
        solve();
    }
    
    return 0;
}

标签:1700,CF1325D,return,int,res,infa,异或,mod,define
From: https://www.cnblogs.com/liqs2526/p/17371689.html

相关文章

  • 异或:计算整数0~5的累计异或的3种方式
      #示例10-11计算整数0~5的累计异或的3种方式importfunctoolsimportoperator#方法1:n=0foriinrange(1,6):n^=iprint(n)#方法2:x1=functools.reduce(lambdaa,b:a^b,range(6))print(x1)#方法3:x2=functools.reduce(operator.xor,ra......
  • hihoCoder Challenge 28 异或问题 思维
    Givenasequencea[1..n],youneedtocalculatehowmanyintegersSsatisfythefollowingconditions:(1).0≤S<260(2).Foreveryiin[1,n-1],(a[i]xorS)≤(a[i+1]xorS)InputOnthefirstlinethereisonlyoneintegernOnthesecondlinethere......
  • [P8766 [蓝桥杯 2021 国 AB] 异或三角]题解
    P8766[蓝桥杯2021国AB]异或三角题目描述分析题目中给出了三个限制首先我们不妨设\(a,b\ltc\),则而由于我们把\(c\)作为了最大值,原题需要有序对\((a,b,c)\)所以\(ans\ast3\)1.\(1\leqa,b,c\leqn\)2.\(a\oplusb\oplusc=0\)3.\(a+b\gtc\)而在枚举过程中,......
  • 异或运算
    基本概念异或运算:想同为0,不同为1同或运算:想同为1,不同为0即无进位相加性质0^N==NN^N==0异或运算满足交换律和结合率即:a^b=b^a(a^b)^c=a^(b^c)题一、如何不同额外变量交换两个数inta=a^bintb=a^binta=a^b题二、一个数组中有一种数出现奇数次//arr中,只有一......
  • 为何vs编译边出来的程序ebp-4存放的不是第一个局部变量?而是security_cookie——本质上
    快速识别 最后那个call就是比较存的随机数和ebp异或的值是否和之前是否一样:    探究security_cookie在程序中的作用 from:https://www.kn0sky.com/?p=66学习环境:Windows1020H2+VisualStudio2019前言在学习看反汇编程序的时候,使用VS2019编译的releas......
  • 1835. 所有数对按位与结果的异或和
    题目描述给了列表异或和的定义现在的列表是arr1和arr2构造出来的,元素对是arr[i]andarr[j]问以上列表的异或和?f1-依次确定答案的每一位基本分析为什么考虑计算答案的每一位?表达式只包含位运算(按位与和按位异或)具体怎么计算?要知道答案的第k为是1还是0->分别计算arr1和arr......
  • UVa 11507 Bender B. Rodríguez Problem (模拟&异或)
    11507-BenderB.RodríguezProblemTimelimit:4.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2502Benderisarobotbuiltby Mom'sFriendlyRobotCompany atits......
  • 与& 或| 异或^ 的三个常见用途
    与&或|异或^的三个常见用途1.与&作为掩码(bitmask)屏蔽比特串的一部片/提取比特串的一部分a=0b11010101#Binaryb=0b00000111#Bitmaskc=a&b#c=0b00000101#b作为掩码和a进行与操作后,保留了a的后三位,其余位全设为0被屏蔽了2.或|设1(set)a=0b11010101#......
  • 4月7日leetcode随笔,异或的灵活运用
    给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/single-number著作权归领扣......
  • 一篇关于异或操作的题解 (来源:杭电oj: find your present (2))
    害惭愧惭愧老长时间没写代码了——————————转回正题,对于杭电这个题先说我超时的错误想法—————————————————————————————————————————————————————————————— 一开始我的想法是开一个大小为100000......