【BZOJ4903】【UOJ#300】吉夫特(卢卡斯定理,动态规划)

题面

UOJ

BZOJ:给的UOJ的链接......

题解

首先模的质数更小了,直接给定了\(2\)。当然是卢卡斯定理了啊。

考虑一个组合数在什么情况下会是一个奇数。\(Lucas(n,m)\equiv Lucas(n/2,m/2)*Lucas(n\%2,m\%2)\)。后面这个东西一共只有\(4\)种取值,我们大力讨论一下:\(C_{0}^0=1,C_{0}^1=0,C_1^0=1,C_1^1=1\)。既然是一个奇数,证明\(n,m\)之中不存在任意两个二进制位满足\(n\)是\(0\),\(m\)是\(1\),即\(n\ and\ m=n\)。

现在是一个不上升子序列的相邻两个元素的组合数之积都要是奇数,那么两两之间都要满足这个情况。设\(f[i]\)表示以\(i\)结尾的所有不上升子序列的所求式子的和,每次转移的时候找一个合法的值然后暴力转移过来。但是这样子是\(O(n^2)\)的,考虑如何优化。首先值域范围很小,我们可以开桶暴力记答案,然而这个数据范围很巧妙,每次对于每个数,我们需要枚举集合,这样子的复杂度是\(O(3^{log n}=3^{18})\),完美的\(TLE\),而\(3^{17}\)的复杂度就是在时间边缘试探。(然而老邬说他\(3^{18}\)大力艹过去了),然而我暴力也过去了。

根据二进制毒瘤做法,我们把二进制数拆分成前一半\(9\)位和后一半\(9\)位,先暴力枚举前\(9\)位,然后对于后\(9\)位再做子集枚举,这样子复杂度就瞬间降下来了。

先放暴力AC代码

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 250000*2
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int s[MAX],a[MAX],n,f[MAX];
int lg[MAX],mx,ans;
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)mx=max(mx,a[i]);
for(int i=2;i<=mx;++i)lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;++i)
{
int p=((1<<(lg[mx]+1))-1)^a[i];f[i]=1;
for(int t=p;t;t=(t-1)&p)
add(f[i],s[a[i]|t]);
add(ans,s[a[i]]=f[i]);add(ans,MOD-1);
}
printf("%d\n",ans);
return 0;
}

按照二进制位折半分,大概比上面的暴力快了\(10\)倍的样子。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define MAX 250000
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int s[1<<10][1<<10],a[MAX],n,f[MAX];
int lg,mx,ans,llg;
int main()
{
n=read();for(int i=1;i<=n;++i)mx=max(mx,a[i]=read());
lg=log2(mx)+1;llg=lg/2;
for(int i=1;i<=n;++i)
{
int p=(1<<(lg-llg))-1;
int p1=a[i]>>llg,p2=a[i]-(p1<<llg);
for(int t=p^p1;;t=(t-1)&(p^p1)){add(f[i],s[p1|t][p2]);if(!t)break;}
for(int t=p2;;t=(t-1)&p2){add(s[p1][t],f[i]+1);if(!t)break;}
add(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}

【BZOJ4903】【UOJ#300】吉夫特(卢卡斯定理,动态规划)的更多相关文章

  1. 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP

    题目描述 给你一个长度为\(n\)的数列\(a\),求有多少个长度\(\geq 2\)的不上升子序列\(a_{b_1},a_{b_2},\ldots,a_{b_k}\)满足 \[ \prod_{i=2 ...

  2. bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...

  3. 【UOJ#275】组合数问题(卢卡斯定理,动态规划)

    [UOJ#275]组合数问题(卢卡斯定理,动态规划) 题面 UOJ 题解 数据范围很大,并且涉及的是求值,没法用矩阵乘法考虑. 发现\(k\)的限制是,\(k\)是一个质数,那么在大组合数模小质数的情 ...

  4. BZOJ4903 UOJ300 CTSC2017 吉夫特 【Lucas定理】

    BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation&q ...

  5. 【BZOJ4403】序列统计(组合数学,卢卡斯定理)

    [BZOJ4403]序列统计(组合数学,卢卡斯定理) 题面 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取 ...

  6. 【Luogu3807】【模板】卢卡斯定理(数论)

    题目描述 给定\(n,m,p(1≤n,m,p≤10^5)\) 求 \(C_{n+m}^m mod p\) 保证\(P\)为\(prime\) \(C\)表示组合数. 一个测试点内包含多组数据. 输入输 ...

  7. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

  8. 【XSY2691】中关村 卢卡斯定理 数位DP

    题目描述 在一个\(k\)维空间中,每个整点被黑白染色.对于一个坐标为\((x_1,x_2,\ldots,x_k)\)的点,他的颜色我们通过如下方式计算: 如果存在一维坐标是\(0\),则颜色是黑色. ...

  9. 卢卡斯定理&扩展卢卡斯定理

    卢卡斯定理 求\(C_m^n~mod~p\) 设\(m={a_0}^{p_0}+{a_1}^{p_1}+\cdots+{a_k}^{p_k},n={b_0}^{p_0}+{b_1}^{p_1}+\cd ...

随机推荐

  1. .NET小笔记-NPOI读取excel内容到DataTable

    下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用 引入命名空间 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using ...

  2. 校内模拟赛 SovietPower Play With Amstar

    SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...

  3. python第二周。2019.4.13

    1, 我绘制大蟒蛇就是..保存也对着呢,你要是打开文件的话,先闪个黑屏,再闪个白屏..自动退出,然后啥都没了. 我觉得是我代码编错了...再来一遍! 这次到可以,但是这个大蟒蛇好像没有回头... 刚才 ...

  4. 线上分享-- 基于DDD的.NET开发框架-ABP介绍

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

  5. Bash 中常见的字符串操作

    获取字符串长度 ${#string} MyString=abcABC123ABCabc 注意这会自动去掉字符串结尾处的空格,如果在字符串中包含空格(开头.中间或结尾),就需要使用引号把字符串包裹起来: ...

  6. 我就骂你了,我tm还想打你呢

    从地铁出来,一男的抽烟走在我前面,走了一路闻了一路二手烟. 进门,一个园区的,我直接骂了一句:caoni妈的 这哥们瞪着我,我也瞪着他 你骂我干什么 我闻了一路子二手烟 你可以走前面啊 我不走啊 我不 ...

  7. Telephone Phrases

    There are some common phrases and sentences you can use when speaking on the telephone. The informal ...

  8. Centos7.3下安装Jumpserver 1.0.0(支持windows组件)

    Jumpserver最新版本支持windows组件,废话不多介绍了,下面直接介绍下部署过程: 0)系统环境 CentOS 7.3 IP: 192.168.10.210 [root@jumpserver ...

  9. Popush End

    coconut: (咳咳)作为一名后台开发者,我觉得自己在这次作业完成中最大的收获就是跟node.js的异步模型打交道.首先我得出了一个这样的结论:异步模型能够提高服务器的高性能并发请求,但是却加大了 ...

  10. 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

    前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调 ...