[UOJ300][CTSC2017]吉夫特
sol
根据\(Lucas\)定理,\(\binom nm \mod 2=\binom{n\%2}{m\%2}\times\binom{n/2}{m/2}\mod 2\)。
由于\(\binom{n\%2}{m\%2}\)的取值只可能是\(0\)或\(1\),以为我们希望\(\binom nm=1\mod 2\),所以\(\binom{n\%2}{m\%2}\)应该始终取值为\(1\)。因为\(\binom 00=\binom 10=\binom 11=1,\binom 01=0\),所以\(\binom{n\%2}{m\%2}\)始终为\(1\)其实就要求了\(n\)在每个二进制位上的值都不小于\(m\)在那位上的值。
这不就是说\(m\)是\(n\)的子集吗?
所以这个题就很简单了吧。枚举子集算当前位的\(dp\)值,复杂度\(O(3^{\log a_i})\)。
这个复杂度假的不行啊。
考虑一些优化。我们相当于是要支持一个数据结构支持插入一个数,或查询某个数的所有子集。上面\(O(3^{\log a_i})\)的做法中,插入和查询一者的复杂度是\(O(3^{\log a_i})\),而另一者是线性的。这样很不优雅,我们考虑尽量均摊这个复杂度。
开桶,记\(t_i\)表示前\(9\)位是\(i\)的前\(9\)位的超集,后\(9\)位与\(i\)的后\(9\)位相同的数之和。这样均摊每\(2^9\)次插入和查询的复杂度是\(O(3^9)\),所以总复杂度就是\(O(6^9)\)。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int mod = 1e9+7;
int n,ans,t[1<<18];
void mdf(int x,int y){
int a=x&(~511),b=x&511;(t[b]+=y)%=mod;
for (int c=a;c;c=(c-1)&a) (t[c|b]+=y)%=mod;
}
int qry(int x){
int a=x&(~511),b=(x&511)^511,res=t[a|511];
for (int c=b;c;c=(c-1)&b) (res+=t[a|(c^511)])%=mod;
return res;
}
int main(){
n=gi();
for (int i=1;i<=n;++i){
int a=gi(),f=qry(a)+1;
ans=(ans+f)%mod;mdf(a,f);
}
printf("%d\n",(ans-n+mod)%mod);return 0;
}
[UOJ300][CTSC2017]吉夫特的更多相关文章
- BZOJ4903 UOJ300 CTSC2017 吉夫特 【Lucas定理】
BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation&q ...
- 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp
题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2 ...
- [CTSC2017]吉夫特
Description: 给定一个序列\(a_1,a_2,a_3...a_n\) 求有多少个不上升子序列: \(a_{b1},a_{b_2}...\) 满足 \(C_{a_{b1}}^{a_{b2}} ...
- BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
题目链接 首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\). 简要证明: 因为是\(mod\ 2\),考虑Lucas定理. 在\(mod\ 2\)的情况下\(C(n,m)\)最后只会 ...
- uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b ...
- bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特
http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇 ...
- BZOJ4903: [Ctsc2017]吉夫特
传送门 可以发现,\(\binom{n}{m}\equiv 1(mod~2)\) 当且仅当 \(m~and~n~=~m\) 即 \(m\) 二进制下为 \(n\) 的子集 那么可以直接写一个 \(3^ ...
- [CTSC2017]吉夫特(Lucas定理,DP)
送70分,预处理组合数是否为偶数即可. 剩下的数据,根据Lucas定理的推论可得当且仅当n&m=n的时候,C(n,m)为奇数.这样就可以直接DP了,对于每个数,考虑它对后面的数的影响即可,直接 ...
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...
随机推荐
- (10)场景转换(Transitions)
Cocos2d-x最爽的一个特性之一就是提供了在两个不同场景之间直接转换的能力.例如:淡入淡出,放大缩小,旋转,跳动等.从技术上来说,一个场景转换就是在展示并控制一个新场景之前执行一个转换效果. 场景 ...
- Ubuntu16.04 下创建新用户并赋予sudo权限
https://blog.csdn.net/wales_2015/article/details/79643336
- rails 日期取值
获取当前时间 当前时间 Time.now UTC时间, 国际标准时间 Time.now.utc 日相关 今日开始时间00:00:00 Time.now.beginning_of_day => 2 ...
- 15信号sigaction
信号处理 信号值小于 SIGRTMIN 的信号 (1~31) 都是不可靠信号 某些unix版本中,调用信号函数处理后会自动恢复默认信号处理,所以在信号处理函数中还需要继续调用signal函数设置信号处 ...
- 2018 Multi-University Training Contest 1 Solution
A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...
- zw“小数据”理论也碰上了“黑天鹅”
4月上旬,在blog<大数据和高频量化交易 >,我们曾经说过: 实战测试,数据越多,反而会影响精度.目前个人数据分析的一个重点,就是"小"数据.老子<道德经·第六 ...
- AVAudioFoundation(1):使用 AVAsset
本文转自:AVAudioFoundation(1):使用 AVAsset | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 要了 ...
- bzoj1606 / P2925 [USACO08DEC]干草出售Hay For Sale(01背包)
P2925 [USACO08DEC]干草出售Hay For Sale 简化版01背包(连价值都免了) 直接逆推解决 #include<iostream> #include<cstdi ...
- Using SQLXML Bulk Load in the .NET Environment
http://msdn.microsoft.com/en-us/library/ms171878.aspx 1.首先创建一张表 CREATE TABLE Ord ( OrderID ,) PRIMAR ...
- TC SRM 584 DIV2
250pt: 水题set处理. 500pt: 题意: 给你一个图,每条边关联的两点为朋友,题目要求假设x的金钱为y,则他的左右的朋友当中的钱数z,取值为y - d <= z <= y + ...