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. typedef struct用法详解与小结

    1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef ...

  2. Entity Framework之犹豫不决

    记得去年初就开始关注Entity Framework,那时只是简单测试了一下,发现较之Nhibernate不太成熟.当时的EF主要表驱动方式开发,过度依赖edm文件,并且数据层耦合了模型层,让一些MV ...

  3. Allow Zero Length 允许空字符串 ACCESS

    http://www.360doc.com/content/11/0118/20/991597_87447868.shtml https://microsoft.public.data.ado.nar ...

  4. 多重继承,虚继承,MI继承中虚继承中构造函数的调用情况

    先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include < ...

  5. 相同类型的对象不能互相转换:java.lang.ClassCastException: com.anhoo.po.UserPo cannot be cast to com.anhoo.po.UserPo

    @PostMapping("/findone") public String getone(UserVo userVo) throws IllegalAccessException ...

  6. [翻译]HTTP--一个应用级的协议

    原文地址:HTTP — an Application-Level Protocol 简介 在不丹,当人们见面时,他们通常用“你身体还好吗?”互相打招呼.在日本,根据当时的情形,人们可能会互相鞠躬.在阿 ...

  7. 高版本的jdk编译过的项目移到低版本的JDK的eclipse中出错的问题

    由于2台电脑安装的jdk版本不一样,导致从一台电脑移动项目到另一台电脑上时,运行出现了错误,错误信息如下: 主要是原先项目运行的JDK版本为1.8, 而要移过去的电脑的jdk是1.7的,首先已经把bu ...

  8. ztree树形菜单的增加删除修改和换图标

    首先需要注意一点,如果有研究过树形菜单,就会发现实现删除和修改功能特别简单,但是增加却有一点复杂.造成这个现象是ztree树形菜单的历史遗留问题.大概是之前的版本没有增加这个功能,后来的版本加上了这个 ...

  9. Android实现EditText的富文本编辑

    前言 本文是我之前写的这篇文章<Android图文混排-实现EditText图文混合插入上传>的升级版,除了在EditText实现了图片上传之外,还包含了视频上传.云盘文件上传.录音上传以 ...

  10. ZOJ 1985 Largest Rectangle in a Histogram(刷广告)2010辽宁省赛

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21204 ...