[UOJ450][单位根反演]集训队作业2018:复读机

UOJ450

d ≤ 3 d\le3 d3,所以分类讨论
d = 1 d=1 d=1就很简单了,快速幂即可
如果 d = ̸ 1 d=\not1 d≠1,考虑生成函数 F ( x ) = ∑ i = 0 ∞ [ d ∣ i ] x i i ! F(x)=\sum_{i=0}^{\infin}{[d|i]\frac{x^i}{i!}} F(x)=i=0[di]i!xi
单位根反演: F ( x ) = ∑ i = 0 ∞ 1 d ∑ j = 0 d − 1 ( ω d i ) j x i i ! F(x)=\sum_{i=0}^{\infin}\frac{1}{d}\sum_{j=0}^{d-1}(\omega_d^i)^j\frac{x^i}{i!} F(x)=i=0d1j=0d1(ωdi)ji!xi
F ( x ) = ∑ i = 0 ∞ 1 d ∑ j = 0 d − 1 ( ω d j x ) i i ! F(x)=\sum_{i=0}^{\infin}\frac{1}{d}\sum_{j=0}^{d-1}\frac{(\omega_d^jx)^i}{i!} F(x)=i=0d1j=0d1i!(ωdjx)i

d = 2 d=2 d=2 d = 3 d=3 d=3均可以暴力展开算

Code:

#include<bits/stdc++.h>
#define mod 19491001
#define ll long long
#define g 7
using namespace std;
inline int read(){
	int res=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
	while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
	return res*f;
}
const int N=5e5+5;
inline int add(int x,int y){x+=y;if(x>=mod) x-=mod;return x;}
inline int dec(int x,int y){x-=y;if(x<0) x+=mod;return x;}
inline int mul(int x,int y){return (ll)x*y%mod;}
inline void inc(int &x,int y){x+=y;if(x>=mod) x-=mod;}
inline void Dec(int &x,int y){x-=y;if(x<0) x+=mod;}
inline void Mul(int &x,int y){x=mul(x,y);}
inline int ksm(int a,int b){int res=1;for(;b;b>>=1,Mul(a,a)) if(b&1) Mul(res,a);return res;}
int fac[N],ifac[N];
inline int C(int n,int m){if(n<m) return 0;return mul(fac[n],mul(ifac[m],ifac[n-m]));}
int main(){
	fac[0]=ifac[0]=1;
	for(int i=1;i<=N-4;i++) fac[i]=mul(fac[i-1],i);
	ifac[N-4]=ksm(fac[N-4],mod-2);
	for(int i=N-5;i;i--) ifac[i]=mul(ifac[i+1],i+1);
	ifac[0]=1;
	int n=read(),k=read(),d=read();
	int res=0;
	if(d==1) {cout<<ksm(k,n);return 0;}
	else if(d==2) {for(int i=0;i<=k;i++) inc(res,mul(C(k,i),ksm(dec(2*i,k),n)));Mul(res,ksm(ksm(2,k),mod-2));cout<<res;}
	else{
		int w=ksm(g,(mod-1)/3);
		for(int i=0;i<=k;i++){
			int ans=0;
			for(int j=0;j<=k-i;j++)
				inc(ans,mul(C(k-i,j),ksm((ll)(add(add(i,mul(w,j)),mul(mul(w,w),(k-i-j)))),n)));
			inc(res,mul(ans,C(k,i)));
		}
		Mul(res,ksm(ksm(3,k),mod-2));
		cout<<res;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值