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 ...
随机推荐
- 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)(转)
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: ...
- 巨蟒django之CRM2 展示客户列表&&分页
1.展示客户列表 点击画红线中的views,进入下列界面 路径的查找顺序:应该是先查找外层的templates里边的html,然后查找app里边的templates 另一个会按照app的顺序进行寻找, ...
- python系列十:python3函数
#!/usr/bin/python #-*-coding:gbk-*- '''函数的简单规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必 ...
- 类 String、StringBuffer、StringBuilder
类 String String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持 ...
- 关于:before :after
首先要明白一种思想:结构和样式分离. 结构和样式分离,就意味着:没有样式表,HTML文档也是一个完整的文档:没有样式表,也能正常阅读用HTML表达的所有内容.明白这种思想就能很好理解样式表中使用--- ...
- 解决john不能开多个进程的问题
在使用john进行shadow文件破解时,如果已经开了一个john的进程,这回提示以下错误: Crash recovery file is locked: /root/.john/john.rec ...
- Python操作Redis(一)
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- javaweb action无法跳转、表单无法跳转的解决方法
action无法跳转,表单无法跳转的解决方法 刚在网上搜索了一下,发现我的这篇文章已被非常多人转载了去其他站点.暗爽,只是还是希望大家注明出处. 顺便说明一下.下面是在struts2中通过測试的 ac ...
- PyQt4测试安装ok的程序
# -*- coding: utf-8 -*- """ ------------------------------------------------- File Na ...
- Python 开发者节省时间的 10 个小技巧
Python 是一个美丽的语言,可以激发用户对它的爱.所以如果你试图加入程序员行列,或者你有点厌倦C++,Perl,Java 和其他语言,我推荐你尝试Python. Python有很多吸引程序员的功能 ...