数学课(math)

题目描述

wzy又来上数学课了…… 虽然他很菜,但是数学还是懂一丢丢的。老师出了一道题,给定一个包含nn个元素的集合P=1,2,3,…,nP=1,2,3,…,n,求有多少个集合A⊆PA⊆P,满足任意x∈Ax∈A有2x∉A2x∉A,且对于AA在PP中的补集BB,也满足任意x∈Bx∈B有2x∉B2x∉B。

wzy花费了1E100天终于算出来了这个答案,但是可恶的caoxia居然又加了一个条件!他要求AA的大小恰好为mm,这样又有多少个AA呢?

这回wzy真的不会了,他找到了你,希望能够得到帮助。由于答案太大,你只需要输出答案mod10000019mod10000019即可。

输入

第一行两个数,为n,qn,q。接下来qq行每行一个数mm,询问大小为mm的AA一共有多少个。

输出

共qq行,每行一个数,表示方案数mod10000019

样例解释

对于第一个样例,P={1,2,3},P可以选{1},{2},{1,3},{2,3},大小为1的两种,大小为2的也有两种。

对于第二个样例,我想到了一个绝妙的解释,可惜这里写不下。

数据范围及约定

subtask1:20pts,n,m,q≤20n,m,q≤20.

subtask2:30pts,n,m,q≤5,000n,m,q≤5,000.

subtask3:30pts,n,m≤10,000,000,q≤100,000n,m≤10,000,000,q≤100,000

subtask4:20pts,n,m≤1018,q≤100,000n,m≤1018,q≤100,000

来源

noip2018模拟-南外


solution

暴力想法,把每个奇数和他乘上2的若干倍丢进数组

可知我的集合一定要选一半

令x=num/2;

那么如果个数为奇数,可以选x/x+1

为偶数则只能选x个

假设奇数个数的数目为NA,偶数个数为NB,sum为一定得选的个数

答案即C(NA,m-sum)*2^NB

也就是选出m-sum个x+1 nb的可以瞎选(每个两种方案)

注意到模数只有10000019,C(n,m)可以用lucas定理求

lucas忘光。。。

如果n<m可以直接return 0,因为这样子N!一定包括mod

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 10000019
using namespace std;
int q;
ll n,m,x,h[mod+10],ny[mod+10],num[70];
ll work(ll a,ll num){
ll ans=1;
while(num){
if(num&1)ans=ans*a;
a=a*a;a%=mod;ans%=mod;num>>=1;
}
return ans;
}
ll C(int N,int M){
if(N<M)return 0;
return h[N]*ny[M]%mod*ny[N-M]%mod;
}
ll Lucas(ll N,ll M){
if(!M)return 1;
return Lucas(N/mod,M/mod)*C(N%mod,M%mod)%mod;
}
int main()
{
cin>>n>>q;
ll x=2,la=n,cnt=0,sum=0,na=0,nb=0;
if(la%2==0)la--;
while(1){ ll now=n/x;
if(now%2==0)now++;
else now+=2;
num[++cnt]=(la-now)/2+1;
if(cnt&1)na=na+num[cnt];
else nb=nb+num[cnt];
sum=sum+num[cnt]*(cnt/2);
if(now==1)break;la=now-2;x<<=1;
}
h[0]=1;for(int i=1;i<mod;i++)h[i]=h[i-1]*i%mod;
ny[mod-1]=work(h[mod-1],mod-2);
for(int i=mod-2;i;i--)ny[i]=ny[i+1]*(i+1)%mod;ny[0]=1;
while(q--){
scanf("%lld",&m);
if(m<sum||m>na+sum){puts("0");continue;}
ll ans=Lucas(na,m-sum)*work(2,nb)%mod;
ans=(ans+mod)%mod;
printf("%lld\n",ans);
}
return 0;
}

数学课(math)的更多相关文章

  1. math ceil以及math floor,math:round

    ◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数:◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数:◎Math.round()执行标准舍入,即它总 ...

  2. Math.ceil()、Math.floor()和Math.round()

    下面来介绍将小数值舍入为整数的几个方法:Math.ceil().Math.floor()和Math.round(). 这三个方法分别遵循下列舍入规则: Math.ceil()执行向上舍入,即它总是将数 ...

  3. How to give a math lecture

    摘自 http://www.timhsu.net/courses/generic/proof.pdf   或 http://www.timhsu.net/courses/generic/how-to- ...

  4. Java中Math类的几个四舍五入方法的区别

    JAVA取整以及四舍五入 下面来介绍将小数值舍入为整数的几个方法:Math.ceil().Math.floor()和Math.round(). 这三个方法分别遵循下列舍入规则:Math.ceil()执 ...

  5. JavaScript中Math对象的方法介绍

    1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...

  6. JavaScript Math和Number对象

    目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...

  7. Chrome V8引擎系列随笔 (1):Math.Random()函数概览

    先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...

  8. Math.random()

    Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...

  9. Math.abs()方法 取绝对值

    定义和用法 abs() 方法可返回数的绝对值. 语法 Math.abs(x) 参数 描述 x 必需.必须是一个数值. 返回值 x 的绝对值. 实例 在本例中,我将取得正数和负数的绝对值: <sc ...

随机推荐

  1. Hive 之元数据库的三种模式

    Hive 介绍 http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html Hive的数据类型和数据模型 http://www ...

  2. 基于 Nginx && Lua 的简易CC防护方案

    零.前言 1.CC攻击简述 CC攻击(Challenge Collapsar)是常见网站应用层攻击的一种,目的是消耗服务器资源,降低业务响应效率:极端情况会让站点无法正常提供服务: 2.本文要点 旨在 ...

  3. STL笔记(に)--vector容器

    Vector 1.可变长的动态数组 2.需包含头文件#include<vector> (当然,如果用了万能头文件#include<bits/stdc++.h>则可忽略) 3.支 ...

  4. 1412: [ZJOI2009]狼和羊的故事

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4017  Solved: 2037[Submit][Status][Discuss] Descript ...

  5. Mybatis 插入一条或批量插入 返回带有自增长主键记录

    首先讲一下,  插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行, <dependency> <grou ...

  6. MySQL - DELETE 多表联合条件删除

    DELETE t0 FROM t_demo t0, t_user u WHERE t0.id = 6 AND t0.id = u.id

  7. redis Connection refused 远程连接错误

    redis 远程连接时报错:  Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionE ...

  8. UNIX网络通信

    一.网络协议 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型.OSI模型包括应用层.表示层.会话层.传输层.网络层.数据链路层及物理层.而OSI模型过于复杂至今没有得到实际的应用. ...

  9. Java堆内存又溢出了!教你一招必杀技

    JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为 ...

  10. Oracle两种临时表的创建与使用详解

    ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据.当会话退出或者用户提交comm ...