• bzoj3992: [SDOI2015]序列统计


    Description

    小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。
    小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi。另外,小C认为这个问题的答案可能很大,因此他只需要你帮助他求出答案mod 1004535809的值就可以了。

    Input

    一行,四个整数,N、M、x、|S|,其中|S|为集合S中元素个数。第二行,|S|个整数,表示集合S中的所有元素。

    Output

    一行,一个整数,表示你求出的种类数mod 1004535809的值。

    Sample Input

    4 3 1 2
    1 2

    Sample Output

    8

    HINT

    【样例说明】

    可以生成的满足要求的不同的数列有(1,1,1,1)、(1,1,2,2)、(1,2,1,2)、(1,2,2,1)、(2,1,1,2)、(2,1,2,1)、(2,2,1,1)、(2,2,2,2)。

    【数据规模和约定】

    对于10%的数据,1<=N<=1000;

    对于30%的数据,3<=M<=100;

    对于60%的数据,3<=M<=800;

    对于全部的数据,1<=N<=109,3<=M<=8000,M为质数,1<=x<=M-1,输入数据保证集合S中元素不重复
     
     
    对集合中的每个元素取个指标就可以化乘为加,然后就可以NTT了
     
    code:
     1 #include<cstdio> 
     2 #include<iostream> 
     3 #include<cmath> 
     4 #include<cstring> 
     5 #include<algorithm> 
     6 #define maxn 16388 
     7 #define mod 1004535809 
     8 #define g 3 
     9 using namespace std; 
    10 typedef long long int64; 
    11 char ch; 
    12 int k,n,x,m,idx,N,root,len,v[maxn],pos[maxn],vis[maxn],rev[maxn]; 
    13 int64 a[maxn],b[maxn],Wn[2][maxn],wn,w,t1,t2; 
    14 bool ok; 
    15 void read(int &x){ 
    16     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1; 
    17     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar()); 
    18     if (ok) x=-x; 
    19 } 
    20 bool check(int x,int p){ 
    21     int tmp=x; ++idx; 
    22     for (int i=1;i<p;tmp=tmp*x%p,i++){ 
    23         if (vis[tmp]==idx) return false; 
    24         vis[tmp]=idx; 
    25     } 
    26     return true; 
    27 } 
    28 int find_root(int p){for (int i=1;i<=p;i++) if (check(i,p)) return i;return 0;} 
    29 int re(int v){ 
    30     int t=0; 
    31     for (int i=0;i<len;i++) t<<=1,t|=v&1,v>>=1; 
    32     return t;    
    33 } 
    34 int64 ksm(int64 a,int64 b){ 
    35     int64 t=1; 
    36     for (;b;b>>=1){if (b&1) t=t*a%mod; a=a*a%mod;} 
    37     return t; 
    38 } 
    39 void ntt(int64 *a,int op){ 
    40     for (int i=0;i<N;i++) if (i<rev[i]) swap(a[i],a[rev[i]]); 
    41     for (int s=2;s<=N;s<<=1){ 
    42         wn=Wn[op][s]; 
    43         for (int i=0;i<N;i+=s){ 
    44             w=1; 
    45             for (int j=i;j<i+(s>>1);j++,w=w*wn%mod){ 
    46                 t1=a[j],t2=w*a[j+(s>>1)]%mod; 
    47                 a[j]=(t1+t2)%mod,a[j+(s>>1)]=((t1-t2)%mod+mod)%mod; 
    48             } 
    49         } 
    50     } 
    51     if (op==1){ 
    52         int64 x=ksm(N,mod-2); 
    53         for (int i=0;i<N;i++) a[i]=a[i]*x%mod;    
    54     } 
    55 } 
    56 void ksm(int k){ 
    57     b[0]=1; 
    58     for (;k;k>>=1){ 
    59         ntt(a,0); 
    60         if (k&1){ 
    61             ntt(b,0); 
    62             for (int i=0;i<N;i++) b[i]=b[i]*a[i]%mod; 
    63             ntt(b,1); 
    64             for (int i=N-1;i>=n-1;i--) b[i-n+1]=(b[i-n+1]+b[i])%mod,b[i]=0; 
    65         } 
    66         for (int i=0;i<N;i++) a[i]=a[i]*a[i]%mod; 
    67         ntt(a,1); 
    68         for (int i=N-1;i>=n-1;i--) a[i-n+1]=(a[i-n+1]+a[i])%mod,a[i]=0; 
    69     } 
    70 } 
    71 int main(){ 
    72     read(k),read(n),read(x),read(m); 
    73     for (int i=1;i<=m;i++) read(v[i]); 
    74     root=find_root(n),N=1; 
    75     while (N<(n<<1)) len++,N<<=1; 
    76     for (int i=0;i<N;i++) rev[i]=re(i); 
    77     for (int i=1;i<=len;i++) Wn[0][1<<i]=ksm(g,(mod-1)/(1<<i)); 
    78     for (int i=1;i<=len;i++) Wn[1][1<<i]=ksm(Wn[0][1<<i],mod-2); 
    79     for (int p=1,i=0;i<n-1;p=p*root%n,i++) pos[p]=i; 
    80     //for (int i=0;i<n;i++) cout<<pos[i]<<' ';cout<<endl; 
    81     for (int i=1;i<=m;i++) if (v[i]) a[pos[v[i]]]++;//,cout<<' '<<pos[v[i]]<<endl; 
    82     ksm(k); 
    83     printf("%lld
    ",b[pos[x]]); 
    84     return 0; 
    85 }
  • 相关阅读:
    Oct 21st-
    ContextLoaderListener 解析
    HTTPS 证书制作及使用
    Spring MVC 源码分析
    思考
    《深入理解java虚拟机》 第七章虚拟机类加载机制
    《深入理解java虚拟机》第六章 类文件结构
    《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略
    《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
    SSM-1第一章 认识SSM框架和Redis
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/4675452.html
Copyright © 2020-2023  润新知