题意:n个物品每个价值a[i],要求选k个,可以重复,问能取到哪几个价值

题解:fft裸题.但是直接一次fft,然后快速幂会boom.这样是严格的\(2^{20}*log2(2^{20})*log(w)\).需要在快速幂里fft,每次取最大的2的次幂,然后fft也boom了,不知道是不是写搓了.ntt过了.....

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 998244353
#define ld long double
//#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-5;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=1000000+10,maxn=1000000+10,inf=0x3f3f3f3f; ll x[N<<3],y[N<<3];
int rev[N<<3];
void getrev(int bit)
{
for(int i=0;i<(1<<bit);i++)
rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
}
void ntt(ll *a,int n,int dft)
{
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int step=1;step<n;step<<=1)
{
ll wn=qp(3,(mod-1)/(step*2));
if(dft==-1)wn=qp(wn,mod-2);
for(int j=0;j<n;j+=step<<1)
{
ll wnk=1;
for(int k=j;k<j+step;k++)
{
ll x=a[k];
ll y=wnk*a[k+step]%mod;
a[k]=(x+y)%mod;a[k+step]=(x-y+mod)%mod;
wnk=wnk*wn%mod;
}
}
}
if(dft==-1)
{
ll inv=qp(n,mod-2);
for(int i=0;i<n;i++)a[i]=a[i]*inv%mod;
}
}
void solve(int k,int p)
{
int sz=0;while((1<<sz)<=p)sz++;sz++;
getrev(sz);
ntt(y,(1<<sz),1);
if(k&1)
{
ntt(x,(1<<sz),1);
for(int i=0;i<(1<<sz);i++)x[i]=x[i]*y[i]%mod;
ntt(x,(1<<sz),-1);
for(int i=0;i<(1<<sz);i++)if(x[i])x[i]=1;
}
for(int i=0;i<(1<<sz);i++)y[i]=y[i]*y[i]%mod;
ntt(y,(1<<sz),-1);
for(int i=0;i<(1<<sz);i++)if(y[i])y[i]=1;
}
int main()
{
int n,k,ma=0;scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
int a;scanf("%d",&a);
y[a]+=1;ma=max(ma,a);
}
x[0]=1;
while(k)solve(k,ma),k>>=1,ma<<=1;
for(int i=1;i<N;i++)if(x[i]!=0)printf("%d ",i);
return 0;
}
/******************** ********************/

最新文章

  1. pfsense 企业应用实例
  2. Objective-C之代理设计模式小实例
  3. PHP中冒号、endif、endwhile、endfor这些都是什么
  4. Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈
  5. 1、MyBatisNet的安装使用
  6. jmeter对http协议中post请求接口测试
  7. H.264 SVC 与H.264 AVC
  8. 谷歌浏览器Chrome播放rtsp视频流解决方案
  9. vue 父子之间通信及非父子之间通信
  10. jquery动态出操作select
  11. Java设计模式(8)——策略模式
  12. 关于MAX30100心率的编程
  13. JavaWeb基础—dbutils的简单入门
  14. Springboot yml获取系统环境变量的值
  15. 3DMAX导出FBX的烘焙动画选项
  16. Atitit JAVA&#160;p2p设计与总结 &#160;JXTA 2
  17. 让网页显示ajax的查询数据
  18. Java笔记 —— 方法重载和方法重写
  19. shell之进程
  20. activity间回传数据

热门文章

  1. (转)利用CAS算法实现通用线程安全状态机
  2. 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335
  3. 20175208《Java程序设计》第五周学习总结
  4. 如何在linux上查看tomcat的端口号
  5. java 几个实用的小工具
  6. PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
  7. js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
  8. 5.list集合添加姓名{张三,李四,王五,二丫,钱六,孙七},将二丫替换为王小丫, 写入到&quot;D:\\stuinfo.txt&quot;
  9. linux执行jmeter脚本解决响应数据为空
  10. Introducation of Servlet filter(servlet过滤器介绍 )