Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E
题意:
共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6)。
问你有多少种长度为y,乘积为x的整数数列。(可以有负数)
题解:
首先考虑数列只有正整数的情况。
将x分解质因数:x = ∑ a[i]*p[i]
由于x较大,所以要先用线性筛求出素数,再枚举素数分解质因数。
那么一个乘积为x的数列可以看做,将x的所有∑ p[i]个质因子,分配到了y个位置上。
设f(i)表示:将p[i]个质因子a[i],分配到y个位置上的方案数。
所以乘积为x的数列总数ans = ∏ f(i)。
其中,f(i)等价于:长度为y,和为p[i]的数列总数。
由于是多组数据,所以要预处理出对于所有长度的f(i)。
dp[i][j]表示y = i时,之和为j的数列总数。
转移:dp[i][j] = ∑ dp[i-1][0 to j]
用前缀和优化转移,总复杂度O(nlogn)。
这样就求出了只考虑正整数情况下的数列总数:ans = ∑ dp[y][p[i]]
然后考虑加负号的情况。
由于x为正数,所以只能加偶数个负号。
所以加负号的方案数 = C(y,0) + C(y,2) + C(y,4) + ... + C(y,偶数)
有一个组合数结论:∑ C(n,偶数) = ∑ C(n,奇数) = 2^(n-1)。
所以最终ans = ans * (2^(y-1))即为最终答案。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_X 1000005
#define MAX_P 25
#define SET_X 1000000
#define SET_P 20
#define MOD 1000000007 using namespace std; int x,y,q;
int cnt,tot=;
int p[MAX_P];
int pw[MAX_X];
int prime[MAX_X];
int dp[MAX_X][MAX_P];
int sum[MAX_X][MAX_P];
bool mark[MAX_X]; void cal_dp()
{
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
dp[][]=;
for(int i=;i<=SET_P;i++) sum[][i]=;
for(int i=;i<=SET_X;i++)
{
for(int j=;j<=SET_P;j++)
{
dp[i][j]=sum[i-][j];
sum[i][j]=(sum[i][j-]+dp[i][j])%MOD;
}
}
} void cal_pw()
{
pw[]=;
for(int i=;i<=SET_X;i++) pw[i]=(pw[i-]<<)%MOD;
} void sieve()
{
memset(mark,false,sizeof(mark));
for(int i=;i<=SET_X;i++)
{
if(!mark[i]) prime[++tot]=i;
for(int j=;j<=tot && (long long)i*prime[j]<=SET_X;j++)
{
mark[i*prime[j]]=true;
if(!(i%prime[j])) break;
}
}
} void resolve()
{
int t=x;
cnt=;
memset(p,,sizeof(p));
for(int i=;i<=tot && prime[i]*prime[i]<=x;i++)
{
if(t%prime[i]==)
{
cnt++;
while(t%prime[i]==)
{
t/=prime[i];
p[cnt]++;
}
}
}
if(t!=) p[++cnt]=;
} int cal_ans()
{
resolve();
long long ans=;
for(int i=;i<=cnt;i++) ans=ans*dp[y][p[i]]%MOD;
return ans*pw[y-]%MOD;
} int main()
{
sieve();
cal_dp();
cal_pw();
cin>>q;
while(q--)
{
cin>>x>>y;
cout<<cal_ans()<<endl;
}
}
Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论的更多相关文章
- Codeforces 893E - Counting Arrays
893E - Counting Arrays 思路:质因子分解. 对于每个质因子,假设它有k个,那么求把它分配到y个数上的方案数. 相当于把k个小球分配到y个盒子里的方案数. 这个问题可以用隔板法(插 ...
- Gym 101981J - Prime Game - [数学题][线性筛+分解质因数][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem J]
题目链接:http://codeforces.com/gym/101981/attachments 题意: 令 $mul(l,r) = \prod_{i=l}^{r}a_i$,且 $fac(l,r)$ ...
- 【20181027T1】洛阳怀【推结论+线性筛+分解质因数+GCD性质】
原题:CF402D [错解] 唔,先打个表看看 咦,没有坏质数好像就是质因数个数啊 那有坏质数呢? 好像变负数了 推出错误结论:f(x)=x的质因数个数,如果有个坏质数,就乘上-1 然后乱搞,起码花了 ...
- 893E - Counting Arrays
E. Counting Arrays time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 264B Good Sequences(DP+素数筛)
题目链接:http://codeforces.com/problemset/problem/264/B 题目大意:给出n个单调递增的数,让你找出最长的好序列,好序列是一种单调递增的并且相邻元素的最大公 ...
- 【???】今天上午的考试题——区间dp和字符串/线性筛的综合应用
T3还没有打出来,就先放两道. ---------------------------------------------------------- T1:密码破译 温温手下的情报部门截获了一封加密信 ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- Divisor counting [线性筛积性函数]
Divisor counting 题目大意:定义f(n)表示整数n的约数个数.给出正整数n,求f(1)+f(2)+...+f(n)的值. 注释:1<=n<=1000,000 想法:我们再次 ...
- Codeforces 822D My pretty girl Noora - 线性筛 - 动态规划
In Pavlopolis University where Noora studies it was decided to hold beauty contest "Miss Pavlop ...
随机推荐
- Hystrix参数说明
参数配置 参数说明 值 备注 groupKey productStockOpLog group标识,一个group使用一个线程池 commandKey addProductStockOpLog com ...
- ubuntu1.4搭建zookeeper3.5.2分布式集群
1.下载 官网链接:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.ta ...
- 0x02 MySQL SQL基本语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写 mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的 ...
- Linux Centos使用脚本安装Docker
1.使用sudo或root权限登录Centos. 2.确保yum包更新到最新. sudo yum update 3.执行Docker安装脚本 # 执行这个脚本会添加docker.repo源并安装Doc ...
- Hard模式学编程
靖难: 我一直推崇一种学习编程的方法,就是learn programming the hard way,我把它翻译为Hard模式学编程 . 我觉得他有以下几个要领: 1. 一开始学习的时候,要尽量去化 ...
- 《Python 机器学习》笔记(四)
数据预处理--构建好的训练数据集 机器学习算法最终学习结果的优劣取决于两个主要因素:数据的质量和数据中蕴含的有用信息的数量. 缺失数据的处理 在实际应用过程中,样本由于各种原因缺少一个或多个值得情况并 ...
- 从yum源下载软件包
以下是从163源下载openstack-ocata版软件包的脚本: from html.parser import HTMLParser from urllib import request impo ...
- DOM加载过程
静态的dom 动态的dom http://blog.csdn.net/cxiaokai/article/details/7552653 一:预编译 解释 js加 ...
- smarty变量调节器与函数
smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...
- 【转】Linux rpm 安装卸载操作
rpm 是红帽(RedHat)软件包管理工具,实现类似于 Windows 中的添加/删除程序功能.下面,就来向大家介绍 rpm 命令的用法. 1. 安装rpm包: rpm -ivh 软件包名 安装软件 ...