题目描述

wzy又来上数学课了…… 虽然他很菜,但是数学还是懂一丢丢的。老师出了一道题,给定一个包含$n$个元素的集合$P=1,2,3……n$求有多少集合$A \subseteq P$,满足$x \in A$且$2x \notin A$且对于$A$在$P$中的补集也要满足相同条件。给定$m$求大小为$m$的$A$有多少个,输出答案$mod~10000019$。

输入

第一行$n,q$,接下来$q$行,每行一个$m$。

输出

对于每个$m$输出答案$mod~10000019$

【样例输入】

  3 3

  0

  1

  2

【样例输出】

  0

  2

  2

【数据范围】

  $n,m<=10^{18}~q<=100000$

分析:

又是计数类问题,应该有DP写法。$n,m$很大,但模数比较小,又可以考虑卢卡斯。

恩,思路比较多。可以先考虑观察找找性质。

$x$和$2x$不能再同一个集合,我们将将$x$和$2x$连一条边,那么$n$个数,就被划分成了若干条链,然后对于每一条链,发现只有两种选法(间隔一个选一个),而且每条链都必须选其中一种。那么总共有多少种选法就很显然了。

考虑题目中要求的集合大小为$m$。不难发现存在无解(即答案为0)。我们假设一条链的链长为$2p$或$2p+1$,那么由于每条链都必须选其中的一半,偶数链选出的个数一定为$p$,但奇数链可以选出$p$或$p+1$。所以可以计算出最少要取几个(下界)最多可以取几个(上界),显然,不在这范围内的$m$就无解了。那么考虑有解情况,偶数链都选$p$不会改变选出数的个数,只有奇数链可以取$p$或$p+1$可以影响选出数的个数。我们用$m$减去下界,然后剩下的数就需要用奇数链中$p+1$多出来的$1$补齐,那么就考虑是那几条奇数链补上的一即可。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
#define p 10000019
using namespace std;
int q,logn;
ll n,m,f[p+5],inv[p+5],l,r,las,mi[70],odd,eve;
inline ll power(ll a,ll x){
ll res=1;
for(;x;a=a*a%p,x>>=1) if(x&1) res=res*a%p;
return res;
}
inline ll C(ll a,ll b){
return a<b?0:f[a]*inv[f[b]]%p*inv[f[a-b]]%p;
}
inline ll lucas(ll a,ll b){
if(a<p&&b<p) return C(a,b);
return C(a%p,b%p)*lucas(a/p,b/p)%p;
}
int main(){
scanf("%lld%d",&n,&q);
inv[1]=f[0]=1;
for(int i=1;i<p;i++) f[i]=f[i-1]*i%p;
for(int i=2;i<p;i++) inv[i]=inv[p%i]*(p-p/i)%p;
for(ll i=n;i;i>>=1) logn++;
mi[0]=1;for(int i=1;i<=logn;i++) mi[i]=mi[i-1]*2;
for(int j=logn;j;j--){
ll now=n/mi[j-1];
ll num=(now+1)/2-las;
las=(now+1)/2;
l+=j/2*num;r+=(j+1)/2*num;
j&1?odd+=num:eve+=num;
}
for(int i=1;i<=q;i++){
scanf("%lld",&m);
if(m<l||m>r){puts("0");continue;}
else printf("%lld\n",lucas(odd,m-l)*power(2,eve)%p);
}
return 0;
}

总结:

计数类问题真的很多都是排列组合DP。这道题也有DP推导的方法。

DTOJ 3987: 数学课的更多相关文章

  1. hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割

    view code//hdu 3987 #include <iostream> #include <cstdio> #include <algorithm> #in ...

  2. ZOJ 3987 Numbers(Java枚举)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987 题意:给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n ...

  3. 洛谷P2826 LJJ的数学课

    题目背景 题目描述(本题是提高组第二题难度+) 题目描述 \(LJJ\)又要开始上数学课啦!(\(T1\),永恒不变的数学) \(LJJ\)的\(Teacher\)对上次的考试很不满意(其实是出题人对 ...

  4. HDU 3987 Harry Potter and the Forbidden Forest(边权放大法+最小割)

    Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/ ...

  5. 数学课(math)

    数学课(math) 题目描述 wzy又来上数学课了-- 虽然他很菜,但是数学还是懂一丢丢的.老师出了一道题,给定一个包含nn个元素的集合P=1,2,3,-,nP=1,2,3,-,n,求有多少个集合A⊆ ...

  6. 【hdu 3987】Harry Potter and the Forbidden Forest

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=3987 [Description] 给出一张有n个点的图,有的边又向,有的边无向,现在要你破坏一些路 ...

  7. 【DTOJ】2704:数字互换

    DTOJ 2704:数字互换  解题报告 2017.11.11 第一版 ——由翱翔的逗比w原创 题目信息: 题目描述 输入两个数作为交换数,输出已交换顺序后的两个值. 输入 两个整数,空格隔开 输出 ...

  8. 【DTOJ】2703:两个数的余数和商

    DTOJ 2703:两个数的余数和商  解题报告 2017.11.10 第一版 ——由翱翔的逗比w原创,引用<C++ Primer Plus(第6版)中文版> 题目信息: 题目描述 给你a ...

  9. 【DTOJ】1001:长方形周长和面积

    DTOJ 1001:长方形周长和面积  解题报告 2017.11.05 第一版  ——由翱翔的逗比w原创 题目信息: 题目描述 已知长方形的长和宽,求长方形的周长和面积? 输入 一行:空格隔开的两个整 ...

随机推荐

  1. Java/JDK/J2SE

    Java8与JDK1.8与JDK8与J2SE8与J2SE1.8的区别是什么? Java是面向对象的编程语言,在我们开发Java应用的程序员的专业术语里,Java这个单词其实指的是Java开发工具,也就 ...

  2. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. LeetCode:并查集

    并查集 这部分主要是学习了 labuladong 公众号中对于并查集的讲解,文章链接如下: Union-Find 并查集算法详解 Union-Find 算法怎么应用? 概述 并查集用于解决图论中「动态 ...

  4. [对对子队]会议记录5.21(Scrum Meeting8)

    今天已完成的工作 吴昭邦 ​ 工作内容:调整快进按钮 ​ 相关issue:优化流水线加入物品的动画 ​ 相关签入:feat: 快进图标更换,更改第四关材料位置 朱俊豪 ​ 工作内容:调整场景高度和视角 ...

  5. BUAA2020软工作业——提问回顾与个人总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...

  6. Windows平台编译器相关的几个预定义宏

    WIN32 是在windows.h 中定义的宏,包含winodws.h则定义该宏 _WIN32/_WIN64跟windows平台有关的宏,_WIN32在windows   32位和64位下都有该宏,_ ...

  7. 一文读懂Android进程及TCP动态心跳保活

    一直以来,APP进程保活都是 各软件提供商 和 个人开发者 头疼的问题.毕竟一切的商业模式都建立在用户对APP的使用上,因此保证APP进程的唤醒,提升用户的使用时间,便是软件提供商和个人开发者的永恒追 ...

  8. 不可错过的stm32单片机直流电机驱动与测速详解

    stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了 ...

  9. 单片机stm32串口分析

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  10. Vue:Vue的介绍以及组件剖析

    介绍 现在,随着基于JavaScript的单页应用程序(SPA)和服务器端渲染(SSR)的兴起,可以用JavaScript编写整个前端应用程序,并整洁地管理和维护该应用程序的前端代码.诸如Angula ...