[CODECHEF]LUCASTH
题意:设$f(n,k)=\sum\limits_{\substack{S\subseteq\{1,\cdots,n\}\\|S|=k}}\prod\limits_{x\in S}x$,问$f(n,0\cdots n)$中有多少个数无法被$p$整除
首先注意到$f(n,k)=[x^{n-k}]\prod\limits_{i=1}^n(x+i)$,所以我们就是要求$P(x)=\prod\limits_{i=1}^n(x+i)$在模$p$意义下有多少项
先分类,设$c=\left\lfloor\frac np\right\rfloor,f(x)=\prod\limits_{i=1}^p(x+i),g(x)=\prod\limits_{i=1}^{n\%p}(x+i)$,那么$P(x)=f^c(x)g(x)$
然后我们有$f(x)\equiv x^p-x(\bmod p)$,证明暂时咕咕咕...这是显然的,因为两边都在模$p$意义下有$p$个根
因为我们要求它有多少项,所以把$f(x)$换成$x^{p-1}-1$是没问题的,为了方便,如果$n\%p=p-1$,我们令$c=\left\lfloor\frac np\right\rfloor+1,g(x)=1$
因为$f^c(x)=\sum\limits_{i=0}^c\binom cix^{i(p-1)}(-1)^{c-i}$只含$x^{i(p-1)}$项且$\deg(g)\lt p-1$,所以它们每一项两两相乘得到的指数不同,也就是说我们只需求出$f^c(x)$和$g(x)$的项数,再相乘即可
对于$f^c(x)$,主要是看$\binom ci$是否被$p$整除,如果把$c$和$i$都写成$p$进制数,根据Lucas定理,仅当$c$的每一位都$\geq i$时$\binom ci\equiv0(\bmod p)$,所以把$c$写成$p$进制数$c_1\cdots c_k$,方案数就是$\prod\limits_{i=1}^k(c_i+1)$
对于$g(x)$,直接分治FFT即可
总时间复杂度$O\left(\log^2n+p\log^2p\right)$
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; typedef double du; const du pi=3.141592653589793238462643383; const int mod=1000000007; int mul(int a,int b){return a*(ll)b%mod;} struct comp{ du x,y; comp(du a=0,du b=0){x=a;y=b;} }; comp operator+(comp a,comp b){return comp(a.x+b.x,a.y+b.y);} comp operator-(comp a,comp b){return comp(a.x-b.x,a.y-b.y);} comp operator*(comp a,comp b){return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} int rev[131072],N; comp w[17][131072]; void pre(int n){ int i,j,k; for(N=1,k=0;N<n;N<<=1)k++; for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1)); for(i=2,k=0;i<=N;i<<=1,k++){ for(j=0;j<i>>1;j++)w[k][j]=comp(cos(j*pi/(i/2)),sin(j*pi/(i/2))); } } void fft(comp*a,int on){ int i,j,k,f; comp t; for(i=0;i<N;i++){ if(i<rev[i])swap(a[i],a[rev[i]]); } for(f=0,i=2;i<=N;i<<=1,f++){ for(j=0;j<N;j+=i){ for(k=0;k<i>>1;k++){ t=w[f][k]; if(on==-1)t.y=-t.y; t=t*a[i/2+j+k]; a[i/2+j+k]=a[j+k]-t; a[j+k]=a[j+k]+t; } } } if(on==-1){ for(i=0;i<N;i++)a[i].x/=N; } } comp t1[131072],t2[131072]; int p; void conv(int*a,int n,int*b,int m,int*c){ int i; pre(n+m); memset(t1,0,N<<4); memset(t2,0,N<<4); for(i=0;i<n;i++)t1[i]=a[i]; for(i=0;i<m;i++)t2[i]=b[i]; fft(t1,1); fft(t2,1); for(i=0;i<N;i++)t1[i]=t1[i]*t2[i]; fft(t1,-1); for(i=0;i<n+m-1;i++)c[i]=llround(t1[i].x)%p; } char s[510]; int num[510],pnum[2010],len,pn; bool div(){ int i,t=0; bool f=0; for(i=len;i>0;i--){ t=t*10+num[i]; num[i]=0; if(t>=p){ num[i]=t/p; t%=p; } if(num[i])f=1; } pnum[pn++]=t; return f; } int*solve(int l,int r){ int mid=(l+r)>>1,*s,*ls,*rs; s=new int[r-l+2]; if(l==r){ s[1]=1; s[0]=l; return s; } ls=solve(l,mid); rs=solve(mid+1,r); conv(ls,mid-l+2,rs,r-mid+1,s); return s; } void work(){ int i,n,df,dg,*a; scanf("%s%d",s,&p); len=strlen(s); for(i=0;i<len;i++)num[len-i]=s[i]-'0'; pn=0; while(div()); pnum[pn]=0; if(pnum[0]==0) dg=1; else if(pnum[0]==p-1){ dg=1; pnum[1]++; for(i=1;i<pn&&pnum[i]==p;i++){ pnum[i]=0; pnum[i+1]++; } }else{ n=pnum[0]; a=solve(1,n); dg=0; for(i=0;i<=n;i++)dg+=(a[i]!=0); } df=1; for(i=1;i<=pn;i++)df=mul(df,pnum[i]+1); printf("%d\n",(mul(df,dg)+mod)%mod); } int main(){ int T; scanf("%d",&T); while(T--)work(); }
[CODECHEF]LUCASTH的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- webstorm vue环境设置
1. 首先安装vue插件,安装方法: setting --> plugin ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...
- ribbon使用eureka的meta进行动态路由
序 使用eureka的元数据信息,再配上ribbon的路由功能,就可以在api-gateway实现很多功能,比如灰度测试.生产调试等等.下面介绍一下,怎么使用jmnarloch大神提供的ribbon- ...
- python进行机器学习(三)之模型选择与构建
Scikit-Learn库已经实现了所有基本机器学习的算法,可以直接调用里面库进行模型构建. 一.逻辑回归 大多数情况下被用来解决分类问题(二元分类),但多类的分类(所谓的一对多方法)也适用.这个算法 ...
- Python爬虫—破解JS加密的Cookie
前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...
- rabbitmq和ons-rocketmq使用对比
MQ,其实目的都是一样,就是应对系统的并发可以实现消峰和解耦的作用,类似于创建了一个线程异步操作,这一点可以了解一下一款优秀的并发框架(Disruptor),据说是每秒可以处理十万级数据, 目前据本人 ...
- Hibernate检索策略与检索方式
hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...
- spring boot&&cloud干货系列
接触spring boot也有些时日了,刚开始博主还想参照官方参考指南自己写一个系列的入门式的教程,包含spring boot的所有模块的用法,后来发现,有一大波优秀的系列文章和项目了,所以就没班门弄 ...
- pdf2htmlEX安装和配置
1.下载 安装的依赖: sudo yum install cmake gcc gnu-getopt java-1.8.0-openjdk libpng-devel fontforge-devel ca ...
- C++11空指针: nullptr
参考[C++11]新特性--引入nullptr NULL 在C++中, 经常会用到空指针, 一般用NULL表示空指针, 但是NULL却是这样定义的 #ifndef NULL #ifdef __cplu ...
- Python+Selenium 自动化实现实例-定位一组对象(checkbox,inputs)
# -*- coding: utf-8 -*- from selenium import webdriver import time import os dr = webdriver.Chrome() ...