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. 软件工程——Word-Counter

    Python实现Word-Counter 一.前言 Github地址:https://github.com/hzquestion/Word-Counter 二.项目概述 实现一个统计程序,它能正确统计 ...

  2. 玩转X-CTR100 l STM32F4 l W25Q64 SPI串行FLASH存储

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载FLA ...

  3. vue-cli 添加less 以及sass

    1.sasscnpm i node-sass --save-dev cnpm i sass-loader --save-dev2.less npm install less --save-dev np ...

  4. SWIFT Optional Value

    SWIFT中有一个类型定义叫可选值,在变量类型后面加一个?号即可定义一个类型为Optional Value的变量,当在使用变量时要用到强制解包!. 如在页面上有一个可选输入年龄的框,在接受数据的时间就 ...

  5. 新手小白Linux(Centos6.5)部署java web项目(mongodb4.0.2安装及相关操作)

    红帽企业或CentOS的Linux上安装MongoDB的社区版: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat ...

  6. Learning from delayed reward (Q-Learning的提出) (Watkins博士毕业论文)(建立了现在的reinforcement Learning模型)

    最近在在学习强化学习方面的东西, 对于现有的很多文章中关于强化学习的知识很是不理解,很多都是一个公式套一个公式,也没有什么太多的解释,感觉像是在看天书一般,经过了较长时间的挣扎最后决定从一些基础的东西 ...

  7. ADC内设与外设的区别

    ADCCLK最大等于14,采样周期为1.5. ADC分两个通道组:规则通道组和注入通道组.规矩通道组就相当于正常运行,而注入通道就相当于中断. ADC为模数转换,而DAC则为数模转换.在芯片引脚中,所 ...

  8. 20155304 2016-2017-2 《Java程序设计》第九周学习总结

    20155304 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC ...

  9. UVA 10305:Ordering Tasks(拓扑排序)

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  10. .NET基金会成立

    作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...