【BZOJ3329】Xorequ 数位DP+矩阵乘法

【BZOJ3329】Xorequ

Description

Input

第一行一个正整数,表示数据组数据 ,接下来T行
每行一个正整数N

Output

2*T行
第2*i-1行表示第i个数据中问题一的解,

第2*i行表示第i个数据中问题二的解,

Sample Input

1
1

Sample Output

1
2

HINT

x=1与x=2都是原方程的根,注意第一个问题的解
不要mod 10^9+7

1<=N<=10^18 
1<=T<=1000

题解:由于x*3中一位最多只会改动3位,所以我一开始想把所有情况都打个表出来,后来发现这个可以严格证明。

x^(3x)=2x -> x^(2x)=3x -> x^(2x)=x+2x -> x^(2x)=x^(2x)+((x&(2x))<<1) -> x&(2x)=0

也就是说x不能有相邻2位都等于1,第一问直接数位DP即可,不过这个DP式好像就是斐波那契数列的递推公式?所以第二问无脑矩乘即可。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
ll n;
ll f[70];
ll ans;
int v[70];
struct node
{
	ll a[5][5];
	node () {memset(a,0,sizeof(a));}
	ll * operator [] (int b) {return a[b];}
	node operator * (node b)
	{
		node c;
		for(int i=0;i<=1;i++)	for(int j=0;j<=1;j++)	for(int k=0;k<=1;k++)	c[i][j]=(c[i][j]+a[i][k]*b[k][j])%P;
		return c;
	}
}res,tr;
void pm(ll y)
{
	while(y)
	{
		if(y&1)	res=res*tr;
		tr=tr*tr,y>>=1;
	}
}
void work()
{
	scanf("%lld",&n);
	int i;
	ans=0;
	for(i=60;~i;i--)
	{
		if((1ll<<i)&n)
		{
			ans+=f[i+1];
			if((1ll<<(i+1))&n)	break;
		}
	}
	if(i<0)	ans++;
	printf("%lld\n",ans-1);
	tr[0][0]=tr[0][1]=tr[1][0]=1,tr[1][1]=0;
	res[0][1]=res[0][0]=1,res[1][0]=res[1][1]=0;
	pm(n);
	printf("%lld\n",res[0][0]);
}
void init()
{
	int i;
	f[1]=f[0]=1;
	for(i=2;i<=60;i++)	f[i]=f[i-1]+f[i-2];
}
int main()
{
	int T;
	scanf("%d",&T);
	init();
	while(T--)	work();
	return 0;
}
时间: 2024-10-16 22:00:58

【BZOJ3329】Xorequ 数位DP+矩阵乘法的相关文章

BZOJ 3329 Xorequ 数位DP+矩阵乘法

题目大意:给定n,求[1,n]以内以及[1,2^n]以内有多少x满足x^3x=2x x^3x=2x等价于x^2x = 3x 而3x=x+2x 且2x=x<<1 故x满足条件当且仅当x&(x<<1)=0 故x的二进制拆分中任意两个1不相邻 令f[i]为i位数中最高位为0的满足条件的数的数量 g[i]为i位数中最高位为1的满足条件的数的数量 则显然有 f[i+1]=f[i]+g[i] g[i+1]=f[i] 于是第一问数位DP 第二问矩阵乘法即可 #include <cs

BZOJ 3329 Xorequ 数字DP+矩阵乘法

标题效果:特定n,乞讨[1,n]内[1,2^n]差多少x满足x^3x=2x x^3x=2x相当于x^2x = 3x 和3x=x+2x 和2x=x<<1 因此x满足条件IFFx&(x<<1)=0 故x的二进制拆分中随意两个1不相邻 令f[i]为i位数中最高位为0的满足条件的数的数量 g[i]为i位数中最高位为1的满足条件的数的数量 则显然有 f[i+1]=f[i]+g[i] g[i+1]=f[i] 于是第一问数位DP 第二问矩阵乘法就可以 #include <cstdi

BZOJ3329 Xorequ 数位dp

noi第一ysy大佬题解. 1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstdio> 5 #include<iostream> 6 7 #define mod 1000000007 8 #define ll long long 9 using namespace std; 10 inline ll read() 11 { 12 ll x=0,f=1

『公交线路 状压dp 矩阵乘法加速』

公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路: 1.设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站. 2.每个车站必须被一辆且仅一辆公交车经过(始发站和终点站也算被经过). 3.公交车只能从编号较小的站台驶往编号较大的站台. 4.一辆公交车经过的相邻两个 站台间距离不得超过Pkm. 在最终设计

HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)

传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少种项链. 分析:这是我做过的最为综合的一道题目(太渣了),首先数位dp筛选出区间[L,R]内的幸运数字总数,dp[pos]表示非限制条件下还有pos位含有的幸运数字个数,然后记忆化搜索一下,随便乱搞的(直接dfs不知会不会超时,本人做法900+ms险过,应该直接dfs会超时),再不考虑旋转相同的情况,可以

【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂

1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2745  Solved: 1694[Submit][Status][Discuss] Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2..

【BZOJ-4386】Wycieczki DP + 矩阵乘法

4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Status][Discuss] Description 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. Input 第一行包含三个整数n,m,k(1<=n<=40,1&

ZOJ - 3216:Compositions (DP&amp;矩阵乘法&amp;快速幂)

We consider problems concerning the number of ways in which a number can be written as a sum. If the order of the terms in the sum is taken into account the sum is called a composition and the number of compositions of n is denoted by c(n). Thus, the

【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种细胞最初的形态是"长条形",一端是头,一端是尾,中间是躯干.细胞内部含有一列密码(你可以认为它是这种细胞的DNA).密码是一个长度为n的数字串,且仅含有1~9这9种数字,沿着细胞的躯干从头到尾排列着. 首先,细胞会经历一次分裂.细胞将沿躯干方向分裂成若干个球体,躯干将退化成丝状物,连接着相