1. 程式人生 > >loj2183/洛谷P3321/bzoj3992 序列統計 原根+NTT

loj2183/洛谷P3321/bzoj3992 序列統計 原根+NTT

題目分析

哎呀原根這個東西忘得差不多了…=。=

對於 P P 的剩餘系的原根 g g ,用 g

k   m o d   P g^k \bmod{P} 可以表示 P
P
的剩餘系中的所有數。

原根的定義是,對於一個群 G G ,單位元為 e e 。將滿足 a

d = e a^d = e 的最小正整數 d d 記作 a a 的階,也就是 o r d ( a ) ord(a) ,那麼使得 o r d ( g ) = G ord(g) = |G| g g 就是 G G 的原根。

由於原根通常情況下都不大,所以我們可以暴力列舉這個原根。那麼 g g P P 的剩餘系的原根的條件是, g P 1 1 ( m o d P ) g^{P-1} \equiv 1 \pmod{P} 且對於任意 P 1 P-1 的質因子 p i p_i ,都有 g P 1 p i ̸ 1 ( m o d P ) g^{\frac{P-1}{p_i}} \not\equiv 1 \pmod{P} 。後面那一個條件是為了滿足 P 1 P-1 是滿足 g d 1 ( m o d P ) g^d \equiv 1 \pmod{P} 的最小正整數,因為 1 1 的冪次都是 1 1 ,所以該條件滿足時, P 1 P-1 無論去掉多少個質因子, g g 的這麼多次方模 P P 都不會為1。

找到 m m 的原根後,若 g k ( m o d m ) g^k \pmod{m} S |S| 中出現過,則 a k = 1 a_k=1 ,否則 a k = 0 a_k=0 。那麼將 a a n n 次最高次項為 m 1 m-1 的迴圈卷積,就能得到選出 n n 個數,乘積模 m m g k ( m o d m ) g^k \pmod{m} 的方案數。用快速冪實現即可。

迴圈卷積?就是做一次NTT後,將 a i + = a m 1 + i a_i+=a_{m-1+i} ,然後 a m 1 + i = 0 a_{m-1+i}=0 即可。

程式碼

#include<bits/stdc++.h>
using namespace std;
#define RI register int
int read() {
	int q=0;char ch=' ';
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') q=q*10+ch-'0',ch=getchar();
	return q;
}
const int G=3,mod=1004535809,N=16390;
int n,m,x,ss,gm,kn,len;
int A[N],k1[N],k2[N],res[N],rev[N],gk[N];

int qm(int x,int p) {return x>=p?x-p:x;}
int ksm(int x,int y,int p) {
	int re=1;
	for(;y;y>>=1,x=1LL*x*x%p) if(y&1) re=1LL*re*x%p;
	return re;
}

void NTT(int *a,int n,int x) {
	for(RI i=0;i<n;++i) if(rev[i]>i) swap(a[i],a[rev[i]]);
	for(RI i=1;i<n;i<<=1) {
		int gn=ksm(G,(mod-1)/(i<<1),mod);
		for(RI j=0;j<n;j+=i<<1) {
			int g=1,t1,t2;
			for(RI k=0;k<i;++k,g=1LL*g*gn%mod) {
				t1=a[j+k],t2=1LL*g*a[j+i+k]%mod;
				a[j+k]=qm(t1+t2,mod),a[j+i+k]=qm(t1-t2+mod,mod);
			}
		}
	}
	if(x==1) return;
	int inv=ksm(n,mod-2,mod);reverse(a+1,a+n);
	for(RI i=0;i<n;++i) a[i]=1LL*a[i]*inv%mod;
}
void mul(int *a,int *b) {
	for(RI i=0;i<kn;++i) k1[i]=a[i],k2[i]=b[i];
	NTT(k1,kn,1),NTT(k2,kn,1);
	for(RI i=0;i<kn;++i) a[i]=1LL*k1[i]*k2[i]%mod;
	NTT(a,kn,-1);
	for(RI i=m-1;i<kn;++i)
		a[i%(m-1)]=qm(a[i%(m-1)]+a[i],mod),a[i]=0;
}

void work1() {
	int flag=0;
	for(RI i=1;i<=ss;++i) if(read()==0) flag=1;
	if(flag) printf("%d\n",qm(ksm(ss,n,mod)-ksm(ss-1,n,mod)+mod,mod));
	else puts("0");
}
int pri[8005],vis[8005],js;
int getgm(int x) {
	int kx=x-1;
	for(RI i=2;i*i<=kx;++i)
		
            
           

相關推薦

loj2183/P3321/bzoj3992 序列統計 +NTT

題目分析 哎呀原根這個東西忘得差不多了…=。= 對於 P P P的剩餘系的原根

[BZOJ3992][SDOI2015]序列統計(DP++NTT)

mod set sub mes bzoj 轉移 font \n sca 3992: [SDOI2015]序列統計 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Sta

P2879 [USACO07JAN]區間統計Tallest Cow

ive it is correct %d ref list lis swa names To 洛谷.2879 區間統計 題目描述 FJ‘s N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are stand

P1410 子序列

logs display onclick () 輸入輸出格式 code flag clas nbsp P1410 子序列 題目描述 給定一個長度為N(N為偶數)的序列,問能否將其劃分為兩個長度為N/2的嚴格遞增子序列, 輸入輸出格式

P2879 [USACO07JAN]區間統計Tallest Cow

return names pla 貪心 其中 amp ace iostream wap 傳送門 題目大意: n頭牛,其中最高身高為h,給出r對關系(x,y) 表示x能看到y,當且僅當y>=x並且x和y中間的牛都比 他們矮的時候,求每頭牛的最高身高. 題解:貪心+差分

P2234 [HNOI2002]營業額統計

efi src ota 經營 pre 計算 name 經濟管理 ios 題目描述 Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 Tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況

P2234 [HNOI2002] 營業額統計 [splay]

region orange img reg esp 突變 pla != microsoft   題目傳送門 營業額統計 題目描述 Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 Tiger拿出了公司的賬本

[樹鏈剖分][線段樹] P2590 樹的統計

scan () pri clu fine edge def class else 題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有一個權值w。 我們將以下面的形式來要求你對這棵樹完成一些操作: I. CHANGE u t : 把結點u的權值改為t II.

P2572 [SCOI2010]序列操作(珂朵莉樹)

傳送門   珂朵莉樹是個吼東西啊 這題線段樹程式碼4k起步……珂朵莉樹只要2k…… 雖然因為這題資料不隨機所以珂朵莉樹的複雜度實際上是錯的…… 然而能過就行對不對…… (不過要是到時候noip我還真不敢打……畢竟CCF那機子……) 1 //minamoto 2 #inclu

2018.11.09 P1110 [ZJOI2007]報表統計(multiset)

傳送門 sb題。 直接用兩個 m u l t

】P5015 標題統計(java)

題目描述 凱凱剛寫了一篇美妙的作文,請問這篇作文的標題中有多少個字元? 注意:標題中可能包含大、小寫英文字母、數字字元、空格和換行符。統計標題字 符數時,空格和換行符不計算在內。 輸入輸出格式 輸入格式:   輸入檔案只有一行,一個字串 ss。  

Luogu P3321 [SDOI2015]序列統計

[SDOI2015]序列統計 題目描述 小C有一個集合\(S\),裡面的元素都是小於\(M\)的非負整數。他用程式編寫了一個數列生成器,可以生成一個長度為\(N\)的數列,數列中的每個數都屬於集合\(S\)。小C用這個生成器生成了許多這樣的數列。但是小C有一個問題需要你的幫助:給定整數\(x\),求所有可

2018.11.09 P1110 [ZJOI2007]報表統計()

傳送門 sb題。 直接用兩個multisetmultisetmultiset維護相鄰兩個數的差值和所有數的前驅後繼。 插入一個數的時候更新一下就行了。 程式碼: #include<bits/std

3648 [APIO2014]序列分割(斜率優化+dp)

首先對於這個題目。 qwq 存在一個性質就是,最終的答案只跟你的分割的位置有關,而和順序無關。 舉一個小栗子 a  

[bzoj3992][SDOI2015]序列統計——離散對數+NTT

ons name make ret bre har 復雜度 etc 題目 題目大意: 給定一個數字不超過\(m\)的集合\(S\),用\(S\)中的數生成一個長度為\(n\)的序列,求所有序列中的元素乘積模\(m\)等於\(x\)的序列的個數。 思路: 考慮最樸素的\(DP

P2572 [SCOI2010]序列操作(ODT)

names || open bound get .org void bool getchar() 題解 題意 題目鏈接 Sol ODT板子題..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #defi

P1410 子序列

這題乍一看毫無思路。顯然不可能窮舉長度為N/2的嚴格遞增子序列。 不過聯想到NOIP1999(普及組)的導彈攔截的第二問,就有思路了。這題其實與它的第二問差不多,只要算出該序列的最大非升子序列長度L,判斷一下是否大於2即可。 1.假如L>2,顯然一個嚴

2234 [HNOI2002]營業額統計——treap(入門)

cti .com nbsp void else com ctime post phi 題目:https://www.luogu.org/problemnew/show/P2234 學習了一下 treap 的寫法。 學習材料:https://blog.csdn.net/l

P4456 交錯序列 [CQOI2018] dp+矩陣優化

new p s 16px http tps 狀態 font family 什麽 正解:dp 解題報告: 傳送門! 首先可以先拆下這個貢獻式,為了方便之後設狀態什麽的,把式子轉成和ny有關,就成了 ∑(n-y)a*yb 然後拆下式子,就可以得到 ∑

BZOJ 3992: [SDOI2015]序列統計 快速冪+NTT(離散對數下)

不同 led gre lan cnblogs 至少 inf tro 程序編寫 3992: [SDOI2015]序列統計 Description 小C有一個集合S,裏面的元素都是小於M的非負整數。他用程序編寫了一個數列生成器,可以生成一個長度為N的數列,數列中