首页 > 其他分享 >[CF1518D] XOR Counting

[CF1518D] XOR Counting

时间:2023-08-29 22:44:06浏览次数:37  
标签:XOR int CF1518D ll Ni% printf Counting dp Mod

XOR Counting
由于 a 可以为非负整数并且不关心 a 的具体数值,所以 m 大了后填很多 0 即可。
分类讨论。
m=1 时直接输出 n 即可。
m>=3 时,注意到 xor 运算与加运算同奇偶,所以 a 只能异或出来与 n 同奇偶的数。
可以构造出 \(a_1=x,a_2=\frac{n-x}{2},a_3=\frac{n-x}{2},a_4=0,a_5=0...\)
所以对于 x<=n 且与 n 同奇偶的数都可以异或出来,用等差数列求和即可。
m=2 时,相当于要求 x+y=n,x^y 的总和。
设 \(dp_{i,0/1}\) 从低到高表示当前在第 i 位,是否向下一位进位的 x^y 的总和,\(f_{i,/1}\) 表示方案数,因为对于每种 x^y 都需要判断是否加上 2^i。转移平凡。

#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int Mod=998244353;
const int Ni=(Mod+1)/2;
ll n,dp[62][2],f[62][2];int T,m;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%lld%d",&n,&m);
		if(n==0){
			printf("0\n");continue;
		}
		if(m==1){printf("%lld\n",n%Mod);continue;}
		if(m>2){
			if(n%2==0){
				ll op=((n-2)%Mod*Ni%Mod+1ll)%Mod;printf("%lld\n",(2ll+n)%Mod*op%Mod*Ni%Mod);
			}
			else{
				ll op=((n-1)%Mod*Ni%Mod+1ll)%Mod;printf("%lld\n",(1ll+n)%Mod*op%Mod*Ni%Mod);
			}
			continue;
		}
		memset(dp,0,sizeof(dp));memset(f,0,sizeof(f));
		if(n&1){
			dp[0][0]=1;f[0][0]=1;
		}
		else{
			f[0][1]=1;f[0][0]=1;
		}
		for(int i=1;i<=60;i++){
			if((n&(1ll<<i))==0){
				dp[i][0]=dp[i-1][0];f[i][0]=f[i-1][0];
				dp[i][1]=dp[i-1][1];
				dp[i][1]=(((dp[i][1]+dp[i-1][0])%Mod)+f[i-1][1]*((1ll<<i)%Mod))%Mod;
				f[i][1]=(f[i-1][0]+f[i-1][1])%Mod;
			}
			else{
				dp[i][0]=dp[i-1][0];f[i][0]=f[i-1][0];
				dp[i][0]=((dp[i][0]+dp[i-1][1])%Mod)%Mod;
				dp[i][0]=(dp[i][0]+f[i-1][0]*((1ll<<i)%Mod))%Mod;
				dp[i][1]=dp[i-1][1];
				f[i][1]=f[i-1][1];
				f[i][0]=(f[i-1][0]+f[i-1][1]%Mod)%Mod;
			}
		}
		printf("%lld\n",dp[60][0]);
	}
	return 0;
}

标签:XOR,int,CF1518D,ll,Ni%,printf,Counting,dp,Mod
From: https://www.cnblogs.com/StranGePants/p/17666017.html

相关文章

  • 【1342C】Yet Another Counting Problem(数论)
    题目大意:求有多少\(x(1\lel\lex\ler\le10^{18})\)满足\((x\moda)\modb\neq(x\modb)\moda(1\lea,b\le200)\),有\(q(1\leq\le500)\)次询问。设答案为\(f(l,r)\),考虑前缀和\(f(l,r)=f(1,r)-f(1,l-1)\),现在问题在于计算\(f(1,x)(1\lex\le10^{18})\)。我们可以发现规......
  • SP13015 CNTPRIME -Counting Primes
    \(CNTPRIME\)-\(Counting\)\(Primes\)题目描述给定初始序列\(A\),然后对原序列有以下操作:操作\(1\):0lrv将区间\([l,r]\)全赋值为\(v\)。操作\(2\):1lr查询区间\([l,r]\)的质数个数。注意:多组测试和特殊的输出。题目分析:就是一道板子题,首先我们先用欧拉筛筛......
  • CF979D Kuro and GCD and XOR and SUM
    题目大意初始有一个空的集合,和\(Q\)个操作。对于每个操作,有两种类型,分别用如下的两种形式表示:1u:加入\(u\)到集合2xks:求一个最大的\(v\),使得:\(v+x\leqs\)\(k\mid\gcd(v,x)\)\(x\oplusv\)最大(其中\(\oplus\)表示按位异或,对应C++中的^运算符)如果找不......
  • 18. 会计惯例 Acounting Convention
    1.有效的财务信息应具有的要素1.1相关性Relevance确认价值ConfirmativeValue帮股东们确认企业经营状况是否达到预期,比如利润表预测价值PredictiveValue帮助潜在投资者分析在未来是否有足够的现金流支撑其运营和偿还债务。比如资产负债表、现金流量表1.2真实性Fai......
  • 题解 ABC309Ex【Simple Path Counting Problem】
    好好玩的题。设普通生成函数\(F_i\),其中\([z^k]F_i\)表示从所有起点走到\((i,k)\)的方案数。特别地,\([z^k]F_1=\sum\limits_{a\inA}[a=k]\)。注意到\(F_i=(z^{-1}+1+z)F_{i-1}\)几乎成立,但是在\([z^1]F_i\)和\([z^M]F_i\)处不成立。尝试对\(F_i\)进行改造:\[[z^k......
  • CF1749D Counting Arrays
    给定一个数组\(a\),同时给定一个操作:选取一个数字\(i\),如果\(\gcd(a_i,i)=1\),我们就可以将当前的第\(i\)位上的数字\(a_i\)移除掉,而后面的数字会以此补上空缺。定义一个序列\(b\)为一个“移除序列”,当且仅当我们可以通过依次选取\(b_1\)到\(b_n\)进行上面所说的操......
  • [ABC098D] Xor Sum 2 题解
    题解传送门题目大意给出一个序列\(A\),求\(A_l\oplusA_{l+1}\oplus\dots\oplusA_r=A_l+A_{l+1}+\dots+A_r\)(\(\oplus\)即为\(xor\)异或)解析众所周知,异或是位运算中的一种不进位加法,即为如果两个\(bit\)相等返回\(0\),反之返回\(1\)。为什么说是不......
  • 6. 权责发生制 Accrual Accounting Basis
    Profitability盈利能力盈利Profit=收入Revenue-开支Expense1.什么是权责发生制在会计学中,收入并不等于收款,开支并不等于付款。将收入和支出记录在它们发生的周期内,而不一定是收款和付款的周期内,这就是权责发生制。权责发生就是收入或支出的确认。2.权责发生制的三......
  • 5.2 复式记账法总体流程 Double Entry Accounting
    1.日记账GeneralJournal账簿格式日期、分类账户、增加金额(借方)、减少金额(贷方)日记账像一个银行流水单,它按时间顺序清晰的记录了一个企业在某个时间段所发生的所有商业交易。如下图:2.把日记账内容记录到分类账户LedgerAcount分类账簿格式:分类账户名称、日期(增)、账户(......
  • 2. 会计恒等式 Accounting Equation
    投资人是企业所有者Owner借款给企业的人为债权人Credit'sEquity欠款为企业债务liabilitesAssets=Liabilites+Oner'sEquity资产=债务+所有者权益(AccountingEquation会计恒等式)这就是FinancialPosition财务状况,注意债务是正值它也是资产的一部分Assets......