zoukankan      html  css  js  c++  java
  • 牛客挑战赛43 D-数组操作

    题目描述


    题解

    因为晚上摸鱼去了所以没打

    设i有p个0q个1,则i的EGF(乘上(p+q)后)为

    (A=0:pe^{p+q}-p)

    (A=1:pe^{p+q}+q)

    分治卷起来之后求x^k即可,特判p=q=0

    code

    #include <bits/stdc++.h>
    #define fo(a,b,c) for (a=b; a<=c; a++)
    #define fd(a,b,c) for (a=b; a>=c; a--)
    #define mod 998244353
    #define Mod 998244351
    #define G 3
    #define ll long long
    //#define file
    using namespace std;
    
    int c[100001],d[100001][2],N,N2,len,n,m,n1,n2,K,i,j,k,l;
    ll A[131072],a[131072],b[131072],ans,s;
    vector<ll> f[100001];
    
    struct type{int s,id;} s1,s2;
    bool operator < (type a,type b) {return a.s>b.s;}
    priority_queue<type> hp;
    
    ll qpower(ll a,int b) {ll ans=1; while (b) {if (b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;} return ans;}
    void dft(ll *a,int tp)
    {
    	int i,j,k,l,S=N,s1=2,s2=1;
    	ll u,v,w,W;
    	
    	fo(i,0,N-1)
    	{
    		j=i,k=0;
    		fo(l,1,len)
    		k=k*2+(j&1),j>>=1;
    		A[i]=a[k];
    	}
    	memcpy(a,A,N*8);
    	
    	fo(i,1,len)
    	{
    		w=(tp==1)?qpower(G,(mod-1)/s1):qpower(G,(mod-1)-(mod-1)/s1),S>>=1;
    		fo(j,0,S-1)
    		{
    			W=1;
    			fo(k,0,s2-1)
    			{
    				u=a[j*s1+k],v=a[j*s1+k+s2]*W;
    				a[j*s1+k]=(u+v)%mod;
    				a[j*s1+k+s2]=(u-v)%mod;
    				W=W*w%mod;
    			}
    		}
    		s1<<=1,s2<<=1;
    	}
    }
    
    int main()
    {
    	#ifdef file
    	freopen("d.in","r",stdin);
    	#endif
    	
    	scanf("%d%d%d",&n,&m,&K),len=ceil(log2(n)),N=qpower(2,len);
    	fo(i,1,n) scanf("%d",&c[i]);
    	fo(i,1,m) scanf("%d%d",&j,&k),++d[j][k];
    	
    	fo(i,1,n)
    	{
    		if (d[i][0])
    		{
    			fo(j,0,d[i][0]+d[i][1]) f[i].push_back(0);
    			f[i][d[i][0]+d[i][1]]=d[i][0];
    			f[i][0]=(c[i])?(-d[i][0]):d[i][1];
    			l=d[i][0]+d[i][1];
    		}
    		else
    		if (c[i]) {printf("0
    ");exit(0);}
    		else
    		f[i].push_back(d[i][1]),l=0;
    		
    		if (d[i][0] || d[i][1])
    		hp.push({l,i});
    	}
    	
    	while (hp.size()>1)
    	{
    		s1=hp.top(),hp.pop();
    		s2=hp.top(),hp.pop();
    		
    		n1=s1.s,n2=s2.s;
    		len=ceil(log2(n1+n2+1)),N=qpower(2,len),N2=qpower(N,Mod);
    		memset(a,0,N*8),memset(b,0,N*8);
    		fo(i,0,n1) a[i]=f[s1.id][i];
    		fo(i,0,n2) b[i]=f[s2.id][i];
    		
    		dft(a,1),dft(b,1);
    		fo(i,0,N-1) a[i]=a[i]*b[i]%mod;
    		dft(a,-1);
    		fo(i,0,N-1) a[i]=a[i]*N2%mod;
    		
    		s1.s=n1+n2;
    		fo(i,0,s2.s) f[s1.id].push_back(0);
    		fo(i,0,s1.s) f[s1.id][i]=a[i];
    		hp.push(s1);
    	}
    	s1=hp.top();
    	fo(i,0,s1.s) s=f[s1.id][i],s=(s+mod)%mod,ans=(ans+s*qpower(i,K))%mod;
    	
    	fo(i,1,n) if (d[i][0]+d[i][1]) ans=ans*qpower(d[i][0]+d[i][1],Mod)%mod;
    	printf("%lld
    ",(ans+mod)%mod);
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    团队项目-选题报告
    图论3-分层图最短路
    图论2-次短路计数
    图论1-k短路
    noi online 提高组t2冒泡排序
    图和树
    搜索(bfs)
    搜索(dfs)
    笔记
    打工
  • 原文地址:https://www.cnblogs.com/gmh77/p/13709240.html
Copyright © 2011-2022 走看看