bzoj 3329 Xorequ 题解(数位DP,矩阵快速幂)

APK静态分析(取证角度)——理论部分 APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。 阅读详情

原题链接:
bzoj:点我QωQ

题意简述

给定一个 n n n,请在

  1. [ 1 , n ] [1,n] [1,n]中(这一问 不 \color{red}不 不取膜)
  2. [ 1 , 2 n ] [1,2^n] [1,2n]中(这一问的答案对 1 0 9 + 7 10^9+7 109+7取膜)

求有多少 x x x满足 x x x^ 3 x = 2 x {3x}=2x 3x=2x,其中 ^表示按位异或。

数据

输入

先有一个 T T T,表示有 T T T组数据。( T &lt; = 1000 T&lt;=1000 T<=1000)
接下来 T T T行,每行一个 n ( n &lt; = 1 0 18 ) n(n&lt;=10^{18}) n(n<=1018)。

输出

对于每个数据,输出两行答案,第一行是 [ 1 , n ] [1,n] [1,n]中的解数,第二行是 [ 1 , 2 n ] [1,2^n] [1,2n]总的解数。第一个 不 \color{red}不 不取膜,第二个取膜。

样例

输入
1
1
输出
1
2

思路

看起来好像 1 1 1简单, 2 2 2难。但是对于我这个数学很好但是不会数位 D P DP DP的数竟狗,我感觉 2 2 2简单, 1 1 1难。无论如何,现在我是都会了。先讲第一问 ⑧ ⑧ ⑧。

part1. 第一问

首先先化简那个式子。同时异或 x x x,得
x x x^ 2 x 2x 2x= 3 x 3x 3x
x x x^ 2 x 2x 2x= x + 2 x x+2x x+2x
我们知道, a + b = a a+b=a a+b=a^ b b b+ ( a (a (a& b ) &lt; &lt; 1 b)&lt;&lt;1 b)<<1(在写 a + b a+b a+b的时候要用到这个)
继续推:
x x x ^ 2 x 2x 2x= x x x ^ 2 x 2x 2x+ ( x (x (x& 2 x ) &lt; &lt; 1 2x)&lt;&lt;1 2x)<<1
( x (x (x& 2 x ) &lt; &lt; 1 = 0 2x)&lt;&lt;1=0 2x)<<1=0
x x x& 2 x = 0 2x=0 2x=0
x x x& ( x &lt; &lt; 1 ) = 0 (x&lt;&lt;1)=0 (x<<1)=0
化简到这里,就相当于 x x x没有连续的 1 1 1。(想想,如果有连续的 1 1 1,那么 x x x和 x &lt; &lt; 1 x&lt;&lt;1 x<<1就会有一个公共位,那么 x x x& ( x &lt; &lt; 1 ) (x&lt;&lt;1) (x<<1)就不会 = 0 =0 =0)

已经能看出来数位 D P DP DP了。设 d p [ i ] [ 0 / 1 ] dp[i][0/1] dp[i][0/1]为长度为 i i i,首位是 0 / 1 0/1 0/1的方案数。
如果第 i i i位是 1 1 1,那么 i − 1 i-1 i−1位一定不能是 1 1 1,只能是 0 0 0。所以 d p [ i ] [ 1 ] = d p [ i − 1 ] [ 0 ] dp[i][1]=dp[i-1][0] dp[i][1]=dp[i−1][0]。
如果第 i i i位是 0 0 0,那随便了, d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + d p [ i − 1 ] [ 1 ] dp[i][0]=dp[i-1][0]+dp[i-1][1] dp[i][0]=dp[i−1][0]+dp[i−1][1]。

然后就是如何拆分的问题。由于是二进制,要稍微简单一点。我们拆分原数,设原数长度为 c n t cnt cnt,位数存在 d d d数里(我是按照网上多数人的写法反着存的,因为正着实在不方便)。考虑两种情况:

  1. 位数比原数小,显然是珂取的。此时答案 = d p [ 1... ( c n t − 1 ) ] [ 1 ] =dp[1...(cnt-1)][1] =dp[1...(cnt−1)][1]
  2. 位数 = = =原数,而且和原数有一些相同的前缀。这个比较复杂。 i i i遍历前缀位置的下一个位置,从 c n t − 1 cnt-1 cnt−1到 1 1 1,就是前缀位置是从 c n t cnt cnt到 2 2 2。显然,第 i i i个位置是珂以取 0 0 0的。当然,如果 d [ i ] d[i] d[i]和 d [ i + 1 ] d[i+1] d[i+1]都是 0 0 0,继续下去就会出错,及时 b r e a k break break掉。当然,这个是取不到原数的,我们考虑将原数加 1 1 1,计算结束再减回来。

part2. 第二问

身为一个数学竞赛狗,以前做过一些数学竞赛题。见IWYMIC2008 第五题:

一个十位数,其数码只能是2或3,且没有2个3是相邻的,这样的十位数有多少个?

简直和这个题一模一样,只是 0 , 1 0,1 0,1换成了 2 , 3 2,3 2,3而已。如果去看那个题的题解(上百度找),会发现:
这 t m ^{tm} tm就是一斐波那契!!!
矩阵快速幂就过了!!!

代码:

#include<bits/stdc++.h>
using namespace std;
namespace Flandle_Scarlet
{
    #define int long long
    #define mod 1000000007
    int t,n;
    int dp[70][2];
    void DP()
    {
        dp[0][0]=1;
        for(int i=1;i<=63;++i)
        {
            dp[i][0]=dp[i-1][0]+dp[i-1][1];
            dp[i][1]=dp[i-1][0];
        }
    }

    int Case1()//第一问
    {
        ++n;//先+1
        int d[70];int cnt=0;
        while(n)
        {
            d[++cnt]=(n&1);
            n>>=1;
        }

        int ans=0;
        for(int i=1;i<cnt;++i)
        {
            ans+=dp[i][1];
        }
        for(int i=cnt-1;i>=1;--i)
        {
            if (d[i]==1)
            {
                ans+=dp[i][0];
                if (d[i+1]==1) break;
            }
        }
        --n;//再回来
        return ans;
    }

    class Matrix//square matrix
    {
        #define N 5//changeable
        public:
            int a[N][N];
            //variable list
            int n;//size
            //initialization
            Matrix()
            {
                memset(a,0,sizeof(a));
                n=0;
            }
            Matrix(int _n)
            {
                memset(a,0,sizeof(a));
                n=_n;
            }
            Matrix(int _n,int _x)
            {_x%=mod;
                n=_n;
                for(int i=0;i<N;++i)
                {
                    for(int j=0;j<N;++j)
                    {
                        a[i][j]=_x;
                    }
                }
            }

            //get value
            int* operator[](int i)
            {
                return *(a+i);
            }
            void Put()
            {
                for(int i=1;i<=n;++i)
                {
                    for(int j=1;j<=n;++j)
                    {
                        printf("%lld ",a[i][j]);
                    }putchar('\n');
                }
            }

            //set value
            void Set(int x)
            {x%=mod;
                for(int i=0;i<N;++i)
                {
                    for(int j=0;j<N;++j)
                    {
                        a[i][j]=x;
                    }
                }
            }
            void Identity()
            {
                memset(a,0,sizeof(a));
                for(int i=0;i<N;++i)
                {
                    a[i][i]=1;
                }
            }
            #undef N //5
    };
    Matrix operator*(Matrix x,Matrix y)
    {
        Matrix ans(x.n,0);
        int n=ans.n;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                for(int k=1;k<=n;++k)
                {
                    ans[i][j]+=x[i][k]*y[k][j];
                    ans[i][j]%=mod;
                }
            }
        }
        return ans;
    }
    Matrix operator^(Matrix x,int p)
    {
        Matrix ans(x.n,0);
        ans.Identity();
        while(p)
        {
            if (p&1) ans=ans*x;
            x=x*x,p>>=1;
        }
        return ans;
    }//矩阵
    
    int Case2()
    {
        if (n==1) return 2;
        if (n==2) return 3;//特判边界

        Matrix Init(2,0);
        Init[1][1]=Init[1][2]=1;

        Matrix Trans(2,1);
        Trans[2][2]=0;

        Matrix Ans(2,0);
        Ans=(Trans^(n+1));
        Ans=Ans*Init;
        return Ans[1][2];//斐波那契板子
    }
    void Solve()
    {
        printf("%lld\n%lld\n",Case1(),Case2());
    }
    void Main()
    {
        if (0)
        {
            freopen("","r",stdin);
            freopen("","w",stdout);
        }
        DP();
        scanf("%lld",&t);
        while(t--)
        {
            scanf("%lld",&n);
            Solve();
        }
    }
    #undef int //long long
    #undef mod //1000000007
};
main()
{
    Flandle_Scarlet::Main();
    return 0;
}

回到总题解界面

R语言中5种正态性检验的方法 统计学中的t检验和方差分析等方法的应用条件是样本都来自正态总体或近似正态总体,只有符合这个条件,才能用这些方法来检验各样本所属的总体参数的差异显著性。文本向大家介绍在R语言中检验正态性的几种方法: 1、Kolmogorov-Smirnov检验 K-S检验检验单一样本是否来自某一特定分布。比如检验一组数据是否为正态分布。它的检验方法是以样本数据的累积频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。K-S检验的原假设和备择假设为: H0:样本所来自的总体分布服从 阅读详情

相关推荐

近4000张真实城市场景行人数据集:YOLO训练实战指南

行人检测是计算机视觉在智能驾驶与机器人感知中的基础任务,其核心挑战在于模型对真实道路场景的鲁棒性——尤其在小目标、遮挡、光照变化及中国特有交通参与者(如外卖骑手、接娃家长)下的泛化能力。本文围绕轻量化、高覆盖、强落地性的近4000张实采图像,系统阐释如何构建面向YOLO系列模型的高质量训练数据集:从四维场景采样策略(光照-遮挡-尺度-姿态)出发,解析标注规范对检测精度的关键影响,并说明数据增强需服务于真实干扰源(雨痕、动态模糊、对比度衰减),而非盲目堆叠。该数据集专为已掌握YOLO训练流程的算法工程师、嵌入

weixin_32495691的博客 298

【BZOJ】3329: Xorequ

【题意】给定方程x^3x=2x,求<=x和<=2^x的满足方程的正整数个数。 【算法】数位DP,矩阵快速幂 【题解】异或相当于不进位加法。 移项得,x^2x=3x,又因为x+2x=3x,所以x+2x不能产生进位。 又2x=x<<1,所以x+(x<<1)不进位当且仅当x中不存在相邻的1。 问题转化为求<=x的二进制不存在相邻1的正整数个数,stat...

weixin_34203832的博客 202

SillyTavern 向量存储配置踩坑记:从卡死到本地部署 Ollama 跑通

用此命令看到镜像就算成功。

qq_62483451的博客 1260

【BZOJ3329】Xorequ(数位dp+矩阵快速幂)

由 x⊕3x=2xx\oplus3x=2xx⊕3x=2x 推出 x⊕2x=3xx\oplus2x=3xx⊕2x=3x,然后又有 x+2x=3xx+2x=3xx+2x=3x。 定理:若 a⊕b=ca\oplus b=ca⊕b=c 且 a+b=ca+b=ca+b=c,则不可能存在 aaa、bbb 在二进制下的某一位都是 111。 证明:设 aaa 在二进制下的第 iii 位为 aia_iai​,bbb 在二进制下的第 iii 位为 bib_ibi​,ccc 在二进制下的第 iii 位为 cic_ici​。显然有

ez_lcw的博客 590

别再手动续期SSL证书了!用acme.sh配合阿里云DNS API,实现全自动HTTPS证书管理

本文详细介绍了如何使用acme.sh配合阿里云DNS API实现SSL/TLS证书的全自动管理,彻底解决手动续期带来的风险与不便。通过自动化部署流程,包括环境准备、API集成、多域名证书申请等关键步骤,帮助运维人员构建高效、可靠的HTTPS证书管理体系,显著提升安全性和运维效率。

weixin_29200485的博客 271

OFDR解调全同弱反射光纤阵列

全同弱反射光纤光栅阵列是在一根光纤上密集刻写波长相同的WFBG,由于每个光栅的反射都比较弱,可实现一根光纤上复用成千上万个光栅,阵列上每个光栅栅区长度相同,相邻光栅之间栅距相同,呈周期性分布。2、获取测量信号:对弱栅阵列加载状态下,使用OFDR系统再次获取弱栅时域曲线,为测量信号。(这里需要注意的是对弱栅阵列加载后,不能使弱栅中心波长漂移到激光器波长扫描范围之外,若超出范围则OFDR技术不能获取弱栅反射信号,因此在选择弱栅阵列波长时尽量让其中心波长在激光器波长扫描范围中间,确保温度/应变测量范围。

m0_69386663的博客 1958

BZOJ 3329 Xorequ (数位DP、矩阵乘法)

题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3329 思路分析: 这道题完全是两道题拼在了一起。。 我们首先观察一下这个等式: 我们不妨可以把它移项变成x&amp;amp;amp;nbsp;xor&amp;amp;amp;nbsp;(2x)=3xx\ xor\ (2x)=3xx&amp;amp;amp;nbsp;xor&amp;amp;amp;nbsp;(2x)=3x 然后我们发现,3x=x+2x3x

suncongbo's blog 397

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5093

BZOJ3329 Xorequ(数位dp+矩阵快速幂)

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都是原方程的根,注意第一个

wzw-yali的博客 471

DRAM自测试模块

1 背景技术DDR3/4 SDRAM属于高速外设,最高时钟频率可达到1600MHz,最高速率可达3200MT/s。在存储控制器与DDR34 SDRAM设备之间有一层专为高速接口设计的模拟电路,此电路对于前端设计人员来说,不管在模拟验证阶段和回片测试阶段,都是一个黑盒子。而对于后端测试人员来说若此部分为外购IP,则内部结构也是无法清楚了解的。所以在测试阶段,对于DDR34 SDRAM的测试就具有一定的

Hierro的DDR世界 7014

Spring AI实现RAG(检索增强生成)详解与实践

支持多种文件格式的文档加载实现高效的向量存储和检索构建智能的问答系统提供可追溯的知识服务RAG技术为AI应用提供了强大的知识增强能力,使得模型能够基于实际文档生成准确、可靠的回答。

beiduofen2011的专栏 1239

bzoj 3329: Xorequ

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3329 思路:根据xor的性质,分析出二进制表示下1是不能相邻的,数位dp和矩阵加速就好 犯了很多低级错误,比如取模和多组数据的清空,可以AFO了,,,, 代码:#include<iostream> #include<cstring> #include<cstdio> #include<s

reflash的博客 879

YOLOv11改进 | 注意力篇 | YOLOv11引入24年最新的ELA注意力机制,并构建C2PSA_ELA

为了解决这些限制,本文介绍了一种高效的本地注意力(ELA)方法,实现了一个简单的结构,大幅度的性能改善。我们精心设计了ELA中的三个超参数,产生了四个不同的版本:ELA-T,ELAB,ELA-S和ELA-L,以满足不同视觉任务的具体要求,如图像分类,目标检测和语义分割。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 1286

bzoj3329: Xorequ 数位DP

题目链接 bzoj3329: Xorequ 题解 x^3x=2x x^2x=3x 因为 a^b+((a&b)<<1)=a+b x^2x=x+2x 那么x和2x的二进制表示中不存在相邻的1 对于第一问数位dp 第二问写出现递推式矩乘优化一下 代码 #include<cstdio> #include<cstring> #include<a...

agtvo48266的专栏 176

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【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 ...

aodanchui1057的博客 192

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

bzoj3329 Xorequ

题目传送门bzoj3329题目传送门bzoj3329 题目 3329:Xorequ3329: Xorequ TimeLimit:1SecTime Limit: 1 Sec MemoryLimit:256MBMemory Limit: 256 MB DescriptionDescription 给定正整数NN 现有如下方程 x⨁3x=2xx\bigoplus3x =

lzx_2014的博客 397

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【BZOJ3329】Xorequ(数位DP)

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 109+7 0≤N≤10^18 1≤T≤1000...

ezoi_ly的博客 377

【bzoj3329】【Xorequ】【数位dp+矩阵乘法】

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与

sunshinezff的专栏 742

BZOJ 3329 Xorequ (数位dp + 矩阵快速幂)

题意:    给定正整数nnn, 现有如下方程x⊕3x=2xx\oplus3x=2xx⊕3x=2x   任务如下: 求出小于等于nnn的正整数中,有多少个是该方程的解 求出小于等于2n2^{n}2n的正整数中,有多少个是该方程的解,模109+710^9+7109+7 解题思路: 问题一: 将原式子变换x⊕2x=3x=x+2xx\oplus2x=3x=x+2xx⊕2x=3x=x+2x xxx xorxorxor yyy ≤\le≤ xxx ororor yyy ≤\le≤ x+yx + yx+y 因此

trouble_的博客 220

[BZOJ3329]Xorequ(数位DP+矩阵快速幂)

好题好题!(又被模数坑了(大雾。。。)) 首先第一问我就死了,把式子全搞到了一边,然后发现那个乘3的非常难做,于是打表找规律。 可以很显然地发现:第二问是个fibonacci数列,很激动,但并没有什么卵用,没有部分分这个题。 第一问其实是化为了问有多少个数在二进制下没有相邻的1,这样就可以用数位DP做了。 dfs记录处理到第几位,上一个是什么,是否受限,是否为最高位,很套路(注意...

weixin_30556959的博客 114

BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]

数 位 D P 开 long long 首先第一问是转化。 于是就可以二进制下DP了。 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括0),于是有fib数列递推关系(很好推),然后矩阵快速幂即可。 一开始思路有点乱,导致边界初始化屡次出错。 WA1:见标题赤字。 WA2:初始化写错了。。。 1 ...

dianer2977的博客 135

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

DescriptionInput第一行一个正整数,表示数据组数据 ,接下来T行 每行一个正整数NOutput2*T行 第2*i-1行表示第i个数据中问题一的解,第2*i行表示第i个数据中问题二的解,Sample Input11 Sample Output12 HINTx=1与x=2都是原方程的根,注意第一个问题的解不要mod 10^9+71<=N<=10^18 1<=T<=1000SourceB

DQS的树洞 1277

BZOJ 3329 Xorequ

题面 Description Input 第一行一个正整数,表示数据组数据 ,接下来T行 每行一个正整数N Output 2T行 第2i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, Sample Input 1 1 Sample Output 1 2 HINT x=1与x=2都是原方程的根,注意第一个问题的解不要mod 109+7 \(1≤N≤10^{18}...

dk810510的博客 144

BZOJ 3329: Xorequ(数位dp+递推)

传送门 解题思路   可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\)。那么第一问就是一个简单的数位\(dp\),第二问考虑递推按位做,设\(f(i)\)表示最后一位为\(0\)的答案,\(g(i)\)表示最后一位为\(1\)的答案,那么\(f(i)=g(i-1)+f(i-1)\),\(g(i)=f(i-1)\),整...

weixin_30653023的博客 148

BZOJ3329 Xorequ(数位DP)

题目大意:x xor 2x=3xx \ xor\ 2x=3x(与x xor 3x=2xx\ xor\ 3x=2x等价)求满足等式且小于nn的x的个数,与满足等式小于2n2^n的数的个数。 因为异或是不进位的二进制加法,那么因为结果正好和加法相同,那么说明x在二进制上没有相邻的1。那么简单的数位DP就可以求出满足这个的答案了。 再看subtask2,根据打表找规律可得,这就是斐波那契数列的第n

geng4512的专栏 1789

【bzoj】3329: Xorequ 【DP】【快速幂&&矩阵乘法】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3329 【有图片 csdn不好粘QAQ 就不发原题了233】**Solution**http://www.cnblogs.com/clrs97/p/4403185.html简单的证明一下第二问 假设我们已经计算出了 2^n 的答案 【也就是二进制下一共有n位】然后我们 考虑2^n+1【也就

远方 775
上一篇: 洛谷 2155[SDOI2008]沙拉公主的困惑 题解(数论)
下一篇: hdu 5242 Game 题解(贪心,树链剖分思想)
LightningUZ
博客等级 码龄9年 33粉丝 254原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值