题意:设$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的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  6. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  7. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

  8. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

随机推荐

  1. 暑假集训——cf热身赛部分题有感加其题解

    刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...

  2. Super A^B mod C (快速幂+欧拉函数+欧拉定理)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...

  3. POj 2104 K-th Number (分桶法+线段树)

    题目链接 Description You are working for Macrohard company in data structures department. After failing ...

  4. hdfs文件上传机制与namenode元数据管理机制

    1.hdfs文件上传机制 文件上传过程:   1.客户端想NameNode申请上传文件, 2.NameNode返回此次上传的分配DataNode情况给客户端 3.客户端开始依向dataName上传对应 ...

  5. .net页面实时预览图片

    <script type="text/javascript"> //获取上传图片的本地路径 function getPath(obj){ if(obj) { if(na ...

  6. FineReport——JS二次开发(分页预览)

    BS访问某个cpt模板,报表servlet将会将cpt文件解析成对应的html,报表内容最终转换为一个table,位于id=content-container的div中. 在模板和html页面中,他们 ...

  7. C++变量类型转换

    1:int转换为CString CString str; str.Format("As string: %d", int); 2:double转换为CString CString ...

  8. 3.4Code

    #include<algorithm> #include<iostream> #include<cstdio> #define inf 0x3f3f3f3f #de ...

  9. servlet为什么要配置web.xml

    (1).为Servlet命名:  <servlet>  <servlet-name>servlet1</servlet-name> <- 这是用于,在serv ...

  10. python 结束练习

    1.文件操作有哪些模式?请简述各模式的作用 r 只读模式 r+ 读写 rb w 只写模式 w+ 写读 wb x 只写模式 x+ 写读 xb a 追加模式 a+ 写读 ab 2.s = '**hello ...