多校训练8,有官方题解

主要之前没写过ntt,感觉不是很懂原根

先贴一份当模板吧

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
const int mo=;
const int g=;
int e[],a[*],b[*],jc[],d[],ni[],r[*];
int w[][],ans[],rg[];
int cas,m,n;
bool cmp(int a,int b)
{
return a>b;
} ll quick(ll x,int y)
{
ll s=;
while (y)
{
if (y&) s=s*x%mo;
x=x*x%mo; y>>=;
}
return s;
}
void ntt(int *a, int f)
{
for (int i=; i<n; i++)
if (i<r[i]) swap(a[i],a[r[i]]);
int now=;
for (int i=; i<n; i<<=)
{
int p=w[++now][f];
for (int j=; j<n; j+=i<<)
{
int w=;
for (int k=; k<i; k++)
{
int u=a[k+j],v=1ll*w*a[j+k+i]%mo;
a[j+k]=(u+v)%mo;
a[j+k+i]=(u-v+mo)%mo;
w=1ll*w*p%mo;
}
}
}
} int main()
{
freopen("1.in","r",stdin);
int now=(mo-)/,ng=quick(g,mo-),l=;
while (now%==)
{
w[++l][]=quick(g,now);
w[l][]=quick(ng,now);
rg[l]=quick(<<l,mo-);
now>>=;
}
jc[]=d[]=ni[]=;
for (int i=; i<=; i++)
{
jc[i]=1ll*jc[i-]*i%mo;
ni[i]=quick(jc[i],mo-);
d[i]=*d[i-]%mo;
}
scanf("%d",&cas);
while (cas--)
{
scanf("%d",&m);
for (int i=; i<=m; i++)
scanf("%d",&e[i]);
sort(e+,e++m,cmp);
memset(a,,sizeof(a));
memset(b,,sizeof(b));
for (int i=; i<=m; i++)
a[i]=1ll*jc[i-]*d[m-i]%mo*e[i]%mo;
for (int i=; i<=m; i++)
b[m-i]=ni[i];
/* for (int i=m+1; i<2*m+1; i++)
{
int s=0;
for (int j=0; j<=i; j++) s=(s+1ll*a[j]*b[i-j]%mo)%mo;
cout <<1ll*s*ni[i-m-1]%mo<<" ";
}
cout <<endl;
break;*/
int l=;
for (n=; n<=*m+; n<<=) l++;
for (int i=; i<n; i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
ntt(a,); ntt(b,);
for (int i=; i<n; i++) a[i]=1ll*a[i]*b[i]%mo;
ntt(a,);
for (int i=m+; i<*m+; i++)
ans[i-m]=1ll*a[i]*ni[i-m-]%mo*rg[l]%mo;
for (int i=; i<=m; i++)
ans[i]=(ans[i-]+ans[i])%mo;
for (int i=; i<=m; i++)
printf("%d ",ans[i]);
cout <<endl;
}
return ;
}

hdu5829的更多相关文章

  1. HDU5829 NTT

    以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstri ...

  2. hdu5829 Rikka with Subset

    首先考虑本题的$O(n^2)$做法. $Part1$ 对原序列从大到小排序后,考虑每个数字对最终答案的贡献,有第x个数字对答案的贡献十分难以计算,所以考虑计算数字x是集合第K大的方案数,作为数字x对$ ...

  3. 多项式相关&&生成函数相关&&一些题目(updating...)

    文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...

随机推荐

  1. G D 3 2 预 处 理 符 号 配 置 中 定 义

    Is mainly used in MCU and peripherals to choose, without having to modify macro definitions in the c ...

  2. Linux和Windows上实现的异同-Linux的自适应ACK

    上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...

  3. AdjustTokenPrivileges启用权限

    原文链接地址:http://blog.csdn.net/xbgprogrammer/article/details/7276760    我们有很多操作需要用到OpenProcess函数,而为了使程序 ...

  4. 【ZJ选讲·画山】

    给出一张纸(N × M),你要在上面画山,但不能画出界(N,M<=100) Like this: 起点为(0,0),终点为(N,0) 给出w种线段画法(x,y),表示用了这种画法后,笔迹末 ...

  5. 创建dll

    在制作dll的时候,如果全局变量不导出,而函数调用中,包含了全局变量,那么会出现全局变量没有值的问题. add.c #pragma once //强制无签名utf-8 #include "a ...

  6. 微信小程序,设置所有标签样式

    page, view, scroll-view, swiper, movable-area, cover-view, text, icon, rich-text, progress, button, ...

  7. Codeforces 937.C Save Energy!

    C. Save Energy! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. POJ1459:Power Network(多源点多汇点的最大流)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 31086   Accepted: 15986 题 ...

  9. Android 对Layout_weight属性完全解析以及使用ListView来实现表格

    用在linearlayout 如果我们想要按照权重比例来分配LinearLayout,我们需要将其宽度设置为0dip http://blog.csdn.net/xiaanming/article/de ...

  10. JavaScript 知识点之escape()与decodeURI()

    解释:escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法:escape(string)参数描述string必需.要被转义或编码的字符串. 返回值:已编码的 str ...