数学课(math)

数学课(math)

数学课(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;
}

 

posted @ 2018-11-04 20:44 liankewei 阅读( ...) 评论( ...) 编辑 收藏
对于寻找清华大学丘成桐班数学分析课程的视频资源,通常这类高质量教育资源可能不会完全公开在网上。但是,可以尝试以下几个途径来获取相关信息或者类似的教学材料: 查找官方渠道提供的资源 清华大学官方网站或其在线教育平台可能会提供一些公开课或者是注册学生才能访问的学习资料。 利用学术资源共享网站 Coursera, edX 和学堂在线等平台上有时会有来自顶尖高校的教授录制的专业课程,包括数学分析领域内的高级教程。 关注特定学者的研究成果和个人页面 例如付星副教授提到的合作项目以及丘成桐本人相关的讲座和研讨会录像也可能涉及到数学分析的内容。 加入专门的兴趣小组或论坛交流经验心得 像知乎、豆瓣读书组或是Reddit上的r/math板块都是不错的选择,在这些地方提问往往能得到有价值的线索。 搜索学术会议录播链接 有时候国际国内的重要学术会议上会有关于最新进展的主题报告,而这些活动结束后会被上传至网络供人回顾观看。 由于具体的“丘成桐班”内部使用的教材和授课方式属于学校特设班级的一部分,直接找到该班级专属的数学分析视频课件可能存在难度。建议联系清华大学相关部门询问是否有对外开放的机会,同时也可以考虑购买正版版物以支持原创作者的同时获得系统化的学习素材。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值