题目链接: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 + 线性筛 + 分解质因数 + 组合数结论的更多相关文章

  1. Codeforces 893E - Counting Arrays

    893E - Counting Arrays 思路:质因子分解. 对于每个质因子,假设它有k个,那么求把它分配到y个数上的方案数. 相当于把k个小球分配到y个盒子里的方案数. 这个问题可以用隔板法(插 ...

  2. 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)$ ...

  3. 【20181027T1】洛阳怀【推结论+线性筛+分解质因数+GCD性质】

    原题:CF402D [错解] 唔,先打个表看看 咦,没有坏质数好像就是质因数个数啊 那有坏质数呢? 好像变负数了 推出错误结论:f(x)=x的质因数个数,如果有个坏质数,就乘上-1 然后乱搞,起码花了 ...

  4. 893E - Counting Arrays

    E. Counting Arrays time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  5. Codeforces 264B Good Sequences(DP+素数筛)

    题目链接:http://codeforces.com/problemset/problem/264/B 题目大意:给出n个单调递增的数,让你找出最长的好序列,好序列是一种单调递增的并且相邻元素的最大公 ...

  6. 【???】今天上午的考试题——区间dp和字符串/线性筛的综合应用

    T3还没有打出来,就先放两道. ---------------------------------------------------------- T1:密码破译 温温手下的情报部门截获了一封加密信 ...

  7. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  8. Divisor counting [线性筛积性函数]

    Divisor counting 题目大意:定义f(n)表示整数n的约数个数.给出正整数n,求f(1)+f(2)+...+f(n)的值. 注释:1<=n<=1000,000 想法:我们再次 ...

  9. Codeforces 822D My pretty girl Noora - 线性筛 - 动态规划

    In Pavlopolis University where Noora studies it was decided to hold beauty contest "Miss Pavlop ...

随机推荐

  1. 如何用SQL为每一行均产生一个随机数

    ) as int) as RndId from 表名

  2. python系列四:Python3字符串

    #!/usr/bin/python #Python3 字符串#可以截取字符串的一部分并与其他字段拼接var1 = 'Hello World!'print ("已更新字符串 : ", ...

  3. 搭建Spring所需的各类jar包汇总详解

    Spring jar包官网下载地址:http://repo.spring.io/release/org/springframework/spring/ Spring jar包的描述:针对3.2.2以上 ...

  4. ArcGIS Server Q&A

    持续更新.. 一. AGS Server10发布mobile data access 出现错误 问题描述: "ArcGIS Server: Configuration <name> ...

  5. return和yield的区别

    # return 返回给调用者值,并结束此函数.#yiled 返回给调用者值,并将指针停留着当前位置.

  6. 联想Y50用U盘改装win7的详细教程

    由于一些原因,部分网友想把自带的win8.1系统改成win7,苦于Y50没有光驱,装系统不方便,下面特意做一个用U盘改装系统的教程,先准备一个8G或更大的U盘,如果里面有重要文件,请先备份,等会要清空 ...

  7. 剑指offer 面试10题

    面试10题: 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1 ...

  8. knockout注释标签----逻辑判断(学习笔记,欢迎拍砖)

    使用knockout绑定数据时,需要进行判断处理 <!-- ko if:$root.ifHaveVideo($data) --> 这里不是被注释掉的代码 是逻辑判断代码 有效的 <d ...

  9. 【转】Python的hasattr() getattr() setattr() 函数使用方法详解

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值 ...

  10. BIO,NIO和AIO

    BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善. NIO: ...