Description

我们定义一种操作是将一个正整数n(n>1)用某个整数d替换,这个数必须是n的约数(1≤d≤n)。给你一个正整数n,
你需要确定操作进行的期望次数,如果我们希望不断地使用这种操作来将n变成1,假设每次操作选择每个可能的d
的概率均等。为了便于计算,输入将给出n和它的所有不同质因数p_1,p_2,?p_m,保证n恰好有m个不同的质因数。
为了便于输出,设答案是有理数a/b,并且有bc≡1(mod10^9+7),你只需要输出ac对10^9+7取模的值。例如当n=351
384000时,期望运算的次数为
1384855049944986283970053414177036273994739277918823/282971529872677632598150446595770345000925504317000≈4.893973081
但你只需要输出321468106即可。

Input

输入包含多组测试数据,以EOF结束。
对于每组测试数据:
第一行包含两个正整数n和m,其中m表示n的不同质因数个数,满足2≤n≤10^24。
第二行包含m个质数p_1,p_2,...,p_m,对于i=1,2,...,m满足2≤p_i≤10^6。
约200000组数据。

Output

对于每组测试数据,输出一行一个整数,表示题目要求输出的值。
对一个询问,答案只和每个质因子的幂次构成的可重集有关,在数据范围内只有约170000个本质不同的询问,因此可以预处理递推出答案
递推式为(f为答案,d为约数个数):
$f(n)=\frac{d(n)+\sum_{i|n and i<n}f(d)}{d(n)-1}$
为了优化这个递推式,将n的质因子的幂次降序排列为p(n,1),p(n,2),p(n,3),...,求和部分考虑记录一个前缀和g(n,k)辅助计算,表示满足 当x<=k时p(a,x)=p(n,x),否则p(a,x)<=p(n,x) 的f(a)之和,按p(n)的字典序升序处理,适当用hash存储g可以使转移复杂度与g的状态数(约1300000)同阶
#include<cstdio>
typedef unsigned int u32;
typedef unsigned long long u64;
u64 pp[];
const u64 _eq=;
const u32 P=1e9+;
struct num{
u64 v0,v1,v2;
void push(u32 x){
v0=v0*+x,v1*=,v2*=;
v1+=v0>>,v0=u32(v0);
v2+=v1>>,v1=u32(v1);
}
bool div(u32 x){
u64 a0=v0,a1=v1,a2=v2;
a1+=a2%x<<,a2/=x;
a0+=a1%x<<,a1/=x;
if(a0%x)return ;
v0=a0/x,v1=a1,v2=a2;
return ;
}
bool read(){
v0=v1=v2=;
int c=getchar();
while(c<){
if(c<)return ;
c=getchar();
}
while(c>)push(c-),c=getchar();
return ;
}
};
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
const u32 M=<<;
struct hmp{
u64 hx[M];
int hy[M],y0;
int&operator[](u64 x){
if(!x)return y0;
int w=x&(M-);
while(hx[w]){
if(hx[w]==x)return hy[w];
w=(w+)&(M-);
}
hx[w]=x;
return hy[w];
}
}H;
int ps[]={,,,,,,,,,,,,,,,,,,,,};
int ss[];
u32 iv[],va=;
u32 inv(u32 a){
if(a<=)return iv[a];
u32 v=;
for(u32 n=P-;n;n>>=,a=u64(a)*a%P)if(n&)v=u64(v)*a%P;
return v;
}
void dfs(int w,int d,double s,u64 h){
if(w){
u64 h1=h,s0=;
u32 c=;
for(int i=;i<w;++i){
int x=ss[i];
c*=(x+);
s0+=H[h1+pp[x-]-pp[x]];
h1+=(_eq-)*pp[x];
}
va+=H[h1]=(s0+c)%P*inv(c-)%P;
for(int i=w-;i>=;--i){
int x=ss[i];
u64 h2=h1+(-_eq)*pp[x];
H[h2]=(H[h1]+H[h2+pp[x-]-pp[x]])%P;
h1=h2;
}
}
for(int i=;i<=d;++i){
s*=ps[w];
if(s>1.01e24)return;
ss[w]=i;
dfs(w+,i,s,h+pp[i]);
}
}
int main(){
num x;
u32 m;
pp[]=;
iv[]=;
for(int i=;i<=;++i)iv[i]=u64(P-P/i)*iv[P%i]%P;
for(u32 i=;i<=;++i)pp[i]=pp[i-]*;
dfs(,,,);
while(x.read()){
u64 h=;
for(m=_();m;--m){
u32 y=_(),t=;
while(x.div(y))++t;
h+=pp[t];
}
printf("%d\n",H[h*_eq]);
}
return ;
}

bzoj 4961: 除除除的更多相关文章

  1. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  2. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  3. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  4. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  5. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  6. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  7. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  8. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  9. bzoj 刷水

    bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. #include <iostream> #include <cst ...

随机推荐

  1. Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划

    固定执行计划-使用SPM(Sql Plan Management)固定执行计划 转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sq ...

  2. 一些java的部署执行编译等命令

    编译: javac 参数 -d 指定编译后文件的位置 java 执行java文件 java生成jar文件 java执行jar文件 java生成war文件 war包是一种将web程序捆绑到单个文件上的一 ...

  3. jQuery一句话实现全选

    一句话实现全选 function selectAll(checkbox){ $('input[type=checkbox]').prop('checked', $(checkbox).prop('ch ...

  4. android源码追踪学习 RecipientsEditor

    RecipientsEditor 新建短信时输入收接者的editor, public class RecipientsEditor extends MultiAutoCompleteTextView  ...

  5. jsx介绍

    jsx与传统的html的区别: 1. jsx:使用的“元素”不局限与html中的元素,可以是任何一个React组件,传统的html是做不到的 (区分是否是组件的原则:看第一个字母是否是大写) 2.js ...

  6. Centos编译Unix网络编程(第三版)卷1的源代码

    测试环境:Centos 1)在shell中输入./configure然后按回车(注意先让configure有执行权限 chomd 777 configure) 2)依次进入lib.libfree.li ...

  7. 日志的处理 —— 使用 log4j

    通过 log4j,日志信息不仅打印到 console,而且输出到指定文件,根据配置信息: <dependency> <groupId>log4j</groupId> ...

  8. opencv-python教程学习系列9-程序性能检测及优化

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍程序性能检测及优化,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环 ...

  9. GPA

    原题: GPA Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  10. 蓝桥杯 ALGO-2:最大最小公倍数

      算法训练 最大最小公倍数   时间限制:1.0s   内存限制:256.0MB        锦囊1 使用贪心来选择. 锦囊2 当n为奇数时,答案一定是n*(n-1)*(n-2). 当n为偶数时, ...