题意:给你n种物品,每种无限个,问恰好取k个物品能组成哪些重量.n<=1000,k<=1000,每种物品的重量<=1000.

我们搞出选取一种物品时的生成函数,那么只要对这个生成函数求k次幂就可以了.结果会很大所以我们可以在模意义下NTT来搞.然而会有一个问题,就是算出来的系数可能恰好是模数的倍数,比如说我们只用998244353就会WrongAnswer on test 20.然后我试了和异化多肽的模数1005060097一块来,然后,WrongAnswer on test 5…Excuse me? 然后看数据,k=1000,物品重量也比较大,分解一下1005060096,发现是2^19*27*71,然后我意识到了:这道题最大需要做最高次数2^20的NTT…然后枚举出了几个2^22*k+1的质数做模数…过了…

以下是枚举出来的一些模数和原根,均为2^22*k+1的形式(不保证k为奇数)

104857601 3

113246209 7

138412033 5

155189249 6

163577857 23

167772161 3

230686721 6

377487361 7

415236097 5

469762049 3

595591169 3

645922817 3

666894337 5

683671553 3

754974721 11

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mod,rt;
int qpow(int a,int x){int ans=;for(;x;x>>=,a=a*1ll*a%mod)if(x&)ans=ans*1ll*a%mod;return ans;}
void ntt(int *a,int n,int sign){
for(int i=,j=,k;i<n;++i){
k=n;do j^=(k>>=);while(j<k);if(i<j)swap(a[i],a[j]);
}
for(int j=;j<=n;j<<=){
int m=j>>;long long wn=qpow(rt,(mod-+sign*(mod-)/j));;
for(int *p=a;p!=a+n;p+=j){
long long w=;
for(int k=;k<m;++k,w=w*wn%mod){
long long t=w*p[m+k]%mod;p[m+k]=(p[k]-t+mod)%mod;p[k]=(p[k]+t)%mod;
}
}
}
if(sign==-){
long long inv=qpow(n,mod-);for(int i=;i<n;++i)a[i]=a[i]*inv%mod;
}
}
const int maxn=*;
int a[maxn],w[maxn];
int ans[maxn];
int N; int n,k;
void NTT(int MOD,int RT){
mod=MOD;rt=RT;memset(a,,sizeof(a));
for(int i=;i<=n;++i)a[w[i]]=;
ntt(a,N,);
for(int i=;i<N;++i)a[i]=qpow(a[i],k);
ntt(a,N,-);//printf("%d\n",ans[1]);
for(int i=;i<N;++i)if(a[i])ans[i]=;
}
int main(){
scanf("%d%d",&n,&k);
int Max=;
for(int i=;i<=n;++i){scanf("%d",&w[i]);if(w[i]>Max)Max=w[i];}
N=;
while(N<=Max*k)N<<=;
//printf("%d\n",ans[0]);
NTT(,);NTT(,);NTT(,);
for(int i=;i<N;++i)if(ans[i])printf("%d ",i);
return ;
}

CodeForces 632E Thief in a Shop的更多相关文章

  1. codeforces 632E. Thief in a Shop fft

    题目链接 E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input stan ...

  2. CodeForces - 632E Thief in a Shop 完全背包

    632E:http://codeforces.com/problemset/problem/632/E 参考:https://blog.csdn.net/qq_21057881/article/det ...

  3. 2019.01.26 codeforces 632E. Thief in a Shop(生成函数)

    传送门 题意简述:给nnn个物件,物件iii有一个权值aia_iai​,可以选任意多个.现在要求选出kkk个物件出来(允许重复)问最后得到的权值和的种类数. n,k,ai≤1000n,k,a_i\le ...

  4. CodeForces - 632E Thief in a Shop (FFT+记忆化搜索)

    题意:有N种物品,每种物品有价值\(a_i\),每种物品可选任意多个,求拿k件物品,可能损失的价值分别为多少. 分析:相当于求\((a_1+a_2+...+a_n)^k\)中,有哪些项的系数不为0.做 ...

  5. Educational Codeforces Round 9 E. Thief in a Shop dp fft

    E. Thief in a Shop 题目连接: http://www.codeforces.com/contest/632/problem/E Description A thief made hi ...

  6. codeforces 632+ E. Thief in a Shop

    E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  7. codeforces Educational Codeforces Round 9 E - Thief in a Shop

    E - Thief in a Shop 题目大意:给你n ( n <= 1000)个物品每个物品的价值为ai (ai <= 1000),你只能恰好取k个物品,问你能组成哪些价值. 思路:我 ...

  8. Educational Codeforces Round 9 E. Thief in a Shop NTT

    E. Thief in a Shop   A thief made his way to a shop. As usual he has his lucky knapsack with him. Th ...

  9. C - Thief in a Shop - dp完全背包-FFT生成函数

    C - Thief in a Shop 思路 :严格的控制好k的这个数量,这就是个裸完全背包问题.(复杂度最极端会到1e9) 他们随意原来随意组合的方案,与他们都减去 最小的 一个 a[ i ] 组合 ...

随机推荐

  1. 算法-PHP实现八大算法

    八大算法原理详解 交换函数:注意要按引用传递,否则无法真正交换两个数的值 function exchange(&$a, &$b){ $temp = $a; $a = $b; $b = ...

  2. Qt-网络与通信-UDP网络通讯

    用户数据报协议是一种简单的轻量级.不可靠.面向数据.无连接的传出层协议,可以应用于在可靠性不是十分重要的场合,如短消息,广播信息等. 例如一下场合 网络数据大多为短消息 拥有大量客户端 对数据安全性无 ...

  3. gitlab-登录账户遇到ERROR: Permission to XXX.git denied to user报错怎么办

    碰到这个问题就意味着没有访问账户的权限,没有把访问电脑与访问账户用ssh_key关联起来,解决流程: 1.查看本地是否有ssh_key 笔者用的是git bash来输入命令 ls -al ~/.ssh ...

  4. Python拼接字符串的7种方法

    1.直接通过+操作: s = 'Python'+','+'你好'+'!'print(s) 打印结果: Python,你好! 2.通过join()方法拼接: 将列表转换成字符串 strlist=['Py ...

  5. HTTP基本定义

    一.网络的简单定义: 1.http:是www服务器传输超文本向本地浏览器的传输协议.(应用层) 2.IP:是计算机之间相互识别通信的机制.(网络层) 3.TCP:是应用层通信之间通信.(传输层) IP ...

  6. Spring Cloud(九):配置中心(消息总线)【Finchley 版】

    Spring Cloud(九):配置中心(消息总线)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-05-07 |  我们在 Spring Cloud(七):配置中心 ...

  7. 376. Binary Tree Path Sum【LintCode java】

    Description Given a binary tree, find all paths that sum of the nodes in the path equals to a given ...

  8. javaee开发工具及环境配置过程

    在配置javaee开发环境的过程中遇到过很多问题,在此系统的整理一下我之前的配置过程 注:配置过程学习自<JSP&Servlet学习笔记(第二版)>详细过程可以阅读此书.在文章的最 ...

  9. vue开发学习中遇到的问题以及解决方法

    1:node-sass 安装失败,可使用 cnpm 安装 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v ...

  10. Ubuntu16.0.4 安装mysql

    1. sudo apt-get install mysql-server 2. sudo apt-get install mysql-client 3.  sudo apt-get install l ...