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 ...
随机推荐
- jetty 通过配置文件嵌入式启动web服务
定义 jetty.xml 启动文件 <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty/ ...
- 取得当前页面的value值问题
取得当前输入input的值 <body> <form action=""> <input type="text" ...
- Time-series Storage Layer Time Series Databases 时间序列
w 关于时间序列数据库的思考-CSDN.NET http://www.csdn.net/article/2015-07-13/2825192 存储和处理时间序列数据(“Time Series Da ...
- JavaWeb 之文件上传
1. 文件上传的要求 1.1 上传对表单的限制 method="post"; enctype="multipart/form-data"; 表单中需要添加文件表 ...
- 基于爬山算法求解TSP问题(JAVA)
一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...
- Spring Cloud架构
Spring Cloud主要的组件,以及它的访间流程 1.外部或者内部的非 Spring Cloud目都统一通过API网关(Zuul)来访可内部服务. 2.网关接收到请求后,从注册中心( Eure ...
- 024-Spring Boot 应用的打包和部署
一.概述 二.手工打包[不推荐] 打包命令:maven clean package 打包并导出依赖:maven clean package dependency:copy-dependencies 1 ...
- 021-Spring Boot 测试,Junit方式使用,mock方式,Controller测试
一.概述 二.Junit方式使用 2.1.基本使用 eclipse在新建的类上,右键→new→Junit Test Case,修改一下Source folder,选择src/test/java,下一步 ...
- corethink功能模块探索开发(二)让这个模块可安装
要想让这个模块可安装,只需要在opcmf.php文件中写一些配置数据就行 随便写点 Equip/opencmf.php <?php // 模块信息配置 return array( // 模块信息 ...
- Shortcut Keys in Eclipse
@1: Here are some shortcut keys in Eclipse that I use a lot.Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开 ...