快速数论变换ntt。

早上才刚刚接触了一下FFT,然后就开始撸这题了,所以要详细地记录一下。

看了这篇巨巨的博客才慢慢领会的:http://blog.csdn.net/cqu_hyx/article/details/52194696

FFT的作用是计算卷积。可以简单的理解为计算多项式*多项式最后得到的多项式,暴力计算是O(n*n)的,FFT可以做到O(nlogn)。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} const int maxn=;
const LL mod=;
const LL G=; LL t[maxn],a[maxn],b[maxn],c[maxn],f[maxn],fac[maxn],NI[maxn];
int T,n,m;
LL rev[maxn],N,len,inv; LL POW[maxn],NiPOW[maxn]; LL power(LL x,LL y)
{
LL res=;
for(;y;y>>=,x=(x*x)%mod)
{
if(y&)res=(res*x)%mod;
}
return res;
} void init()
{
while((n+m)>=(<<len))len++;
N=(<<len);
inv=power(N,mod-);
for(int i=;i<N;i++)
{
LL pos=;
LL temp=i;
for(int j=;j<=len;j++)
{
pos<<=;pos |= temp&;temp>>=;
}
rev[i]=pos;
}
} void ntt(LL *a,LL n,LL re)
{
for(int i=;i<n;i++)
{
if(rev[i]>i)
{
swap(a[i],a[rev[i]]);
}
}
for(int i=;i<=n;i<<=)
{
int mid=i>>; LL wn=power(G,(mod-)/i);
if(re) wn=power(wn,(mod-));
for(int j=;j<n;j+=i)
{
LL w=;
for(int k=;k<mid;k++)
{
int temp1=a[j+k];
int temp2=(LL)a[j+k+mid]*w%mod;
a[j+k]=(temp1+temp2);if(a[j+k]>=mod)a[j+k]-=mod;
a[j+k+mid]=(temp1-temp2);if(a[j+k+mid]<)a[j+k+mid]+=mod;
w=(LL)w*wn%mod;
}
}
}
if(re)
{
for(int i=;i<n;i++)
{
a[i]=(LL)a[i]*inv%mod;
}
}
} bool cmp(LL a,LL b) {return a>b;} LL extend_gcd(LL a,LL b,LL &x,LL &y)
{
if(a==&&b==) return -;
if(b==){x=;y=;return a;}
LL d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
} LL mod_reverse(LL a,LL n)
{
LL x,y;
LL d=extend_gcd(a,n,x,y);
if(d==) return (x%n+n)%n;
else return -;
} int main()
{
fac[]=; for(int i=;i<=;i++) fac[i]=(LL)i*fac[i-]%mod;
for(int i=;i<=;i++) NI[i]=mod_reverse(fac[i],mod);
POW[]=; for(int i=;i<=;i++) POW[i]=(LL)*POW[i-]%mod;
for(int i=;i<=;i++) NiPOW[i]=mod_reverse(POW[i],mod); scanf("%d",&T); while(T--)
{
len=; memset(c,,sizeof c); memset(a,,sizeof a); memset(b,,sizeof b); scanf("%d",&n); m=n;
for(int i=;i<=n;i++) { int x; scanf("%d",&x); t[i]=(LL)x; } sort(t+,t++n,cmp);
for(int i=;i<n;i++)
{
LL x=fac[n]*NI[i]%mod;
a[i]=x*POW[n-i]%mod;
}
for(int i=;i<=n;i++) b[n-i]=t[i]*fac[i-]%mod; init(); ntt(a,N,); ntt(b,N,);
for(int i=;i<=N;i++) c[i]=a[i]*b[i]%mod;
ntt(c,N,); for(int i=;i<n;i++) f[n-i]=c[i]*NI[n]%mod;
for(int i=;i<=n;i++) f[i]=f[i]*NI[i-]%mod;
for(int i=;i<=n;i++) f[i]=f[i]*NiPOW[i]%mod;
LL ans=; for(int i=;i<=n;i++) { ans=(ans+f[i])%mod; printf("%lld ",ans); }
printf("\n");
}
return ;
}

HDU 5829 Rikka with Subset的更多相关文章

  1. HDU 5829 Rikka with Subset(NTT)

    题意 给定 \(n\) 个数 \(a_1,a_2,\cdots a_n\),对于每个 \(K\in[1,n]\) ,求出 \(n\) 个数的每个子集的前 \(K\) 大数的和,输出每个值,对 \(99 ...

  2. HDU 6092`Rikka with Subset 01背包变形

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  3. HDU 6092 Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  4. hdu 6092 Rikka with Subset(逆向01背包+思维)

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  6. hdu 6092 Rikka with Subset (集合计数,01背包)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  7. HDU 6092 Rikka with Subset(dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=6092 题意: 给出两个数组A和B,A数组一共可以有(1<<n)种不同的集合组合,B中则记录了每个数出 ...

  8. hdu 6092 Rikka with Subset(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092 #include <cstdio> #include <iostream> ...

  9. HDU 6092:Rikka with Subset(dp)

    分析 很多个较小的数字可以随机组合成较大的数字,所以B数组从小到大开始遍历,除了空集,最小的那个存在的个数对应的数字必然是a数组中的数字. 每求出这一部分之后,更新后续的B序列. 分析完后,主要的难点 ...

随机推荐

  1. 【锋利的Jquery】读书笔记五

    jquery表单 表格操作 表单从基本的得到和失去焦点表单验证 <script type="text/javascript"> $(function(){ $(&quo ...

  2. Hololens文件读写

    unity 内勾选 RemovableStorage 选项或 Package.appxmanifest 勾选 可移动存储 选项 uwp app IO操作用 StreamReader 会提示没有权限,如 ...

  3. bat脚本学习

    工作需求,写个bat脚本来启动自己的守护进程:bat方面完全空白啊~稍微学习了下,记录下来,后面复习! 直接上代码: 示例一:for字符串切割,切割文本中的字符串: test.txt 文本内容如下: ...

  4. 【JAVA】类继承对父类静态变量的操作

    对静态变量的操作存在继承时还是有一些模糊,做了个简单的测试: class Test { private String mName; public Test(String name) { setName ...

  5. CodeForces 706A Beru-taxi

    简单题. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inclu ...

  6. Unity人工智能学习—确定性AI算法之追踪算法一

    转自http://blog.csdn.net/zhangxiao13627093203/article/details/47451063 尽管随机运动可能完全不可预知,它还是相当无趣的,因为它完全是以 ...

  7. canvas烟花-娱乐

    网上看到一个释放烟花的canvas案例,很好看哦. 新建文本,把下面代码复制进去,后缀名改为html,用浏览器打开即可. 看懂注释后,可以自己修改烟花的各个效果.我试过让烟花炸成了心型.:-) < ...

  8. centos7.0 vsftp配置

    7.0版本 1.安装 yum -y install vsftpd 2.配置 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO //设定不允许匿名访问 loc ...

  9. WinForm 基础

    今天,我开始学习了WinForm.WinForm是客户端程序制作 - C/S,它必须在.NET Framework框架上运行 . 开始,我先学习了一下WinForm的常用窗体属性. 布局:AutoSc ...

  10. 【IE6的疯狂之三】IE6 3像素BUG的实例

    问题:2列布局.左列固定,右列液态我需要做一个布局.2列,左边列固定宽度.右边列使用剩余宽度.整体宽度不固定,这样不管在17 还是19的屏幕上,左边列始终宽度不变,右边列宽度始终占据剩余宽度.但是我写 ...