zoukankan      html  css  js  c++  java
  • 【BZOJ5306】 [Haoi2018]染色

    BZOJ5306 [Haoi2018]染色


    Solution

    xzz的博客

    代码实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #include<iostream>
    using namespace std;
    #define ll long long
    #define re register
    #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
    inline int gi()
    {
    	int f=1,sum=0;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    	return f*sum;
    }
    const int N=500010,Mod=1004535809,G=3;
    int r[N],fac[10000010],n,m,s,W[N],a[N],b[N];
    int qpow(int a,int b){int ret=1;while(b){if(b&1)ret=(ll)ret*a%Mod;a=(ll)a*a%Mod;b>>=1;}return ret;}
    void NTT(int limit,int type,int *A)
    {
    	for(int i=0;i<limit;i++)if(i<r[i])swap(A[i],A[r[i]]);
    	for(int i=1;i<limit;i<<=1)
    	{
    		int gn=qpow(G,(Mod-1)/(i<<1));
    		for(int j=0;j<limit;j+=(i<<1))
    		{
    			int g=1;
    			for(int k=0;k<i;k++,g=(ll)g*gn%Mod)
    			{
    				int t1=A[j+k],t2=(ll)g*A[i+j+k]%Mod;
    				A[j+k]=(t1+t2)%Mod;A[i+j+k]=(t1-t2+Mod)%Mod;
    			}
    		}
    	}
    	if(type==-1)
    	{
    		int inv=qpow(limit,Mod-2);reverse(A+1,A+limit);
    		for(int i=0;i<limit;i++)A[i]=(ll)A[i]*inv%Mod;
    	}
    }
    int C(int n,int m)
    {
    	return (ll)fac[n]*qpow(fac[m],Mod-2)%Mod*qpow(fac[n-m],Mod-2)%Mod;
    }
    int main()
    {
    	n=gi();m=gi();s=gi();
    	for(int i=0;i<=m;i++)W[i]=gi();
    	fac[0]=1;
    	for(int i=1;i<=max(n,m);i++)
    		fac[i]=(ll)fac[i-1]*i%Mod;
    	int lim=min(m,n/s);
    	int limit=1,l=0;
    	while(limit<(lim+1<<1))limit<<=1,l++;
    	for(int i=0;i<limit;i++)
    		r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    	for(int i=0;i<=lim;i++)
    		a[i]=(ll)fac[i]*C(m,i)%Mod*fac[n]%Mod*qpow(m-i,n-i*s)%Mod*qpow((1ll*fac[n-i*s]*qpow(fac[s],i)%Mod),Mod-2)%Mod;
    	for(int i=0;i<=lim;i++)
    	{
    		b[i]=qpow(fac[lim-i],Mod-2);
    		if((lim-i)&1)b[i]=Mod-b[i];
    	}
    	NTT(limit,1,a);
    	NTT(limit,1,b);
    	for(int i=0;i<limit;i++)a[i]=1ll*a[i]*b[i]%Mod;
    	NTT(limit,-1,a);
    	int ans=0;
    	for(int i=0;i<=lim;i++)
    		ans=(ans+(ll)W[i]*a[lim+i]%Mod*qpow(fac[i],Mod-2)%Mod)%Mod;
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    常用算法之选择排序
    常用算法之插入排序
    常用算法之冒泡排序
    Python hashlib模块 (主要记录md5加密)
    Django Model
    CSS实现table td中文字的省略与显示
    JS读取文件,Javascript之文件操作 (IE)
    ie6789和其他浏览器之间的鼠标左、中、右键的event.button不一致的办法
    兼容和样式
    kindeditor的docs
  • 原文地址:https://www.cnblogs.com/mleautomaton/p/10330911.html
Copyright © 2011-2022 走看看