题目大意

  给你 \(n,m\),求

\[\sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i,x_2),\ldots,\gcd(i,x_m))
\]

  对 \({10}^9+7\) 取模。

  \(nm\leq {10}^9\)

题解

  先推一下式子:

\[ans=\sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i,x_2),\ldots,\gcd(i,x_m))\\
=\sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\frac{i}{\gcd(\frac{i}{\gcd(i,x_1)},\frac{i}{\gcd(i,x_2)},\ldots,\frac{i}{\gcd(i,x_m)})}\\
\]

  然后枚举 \(y_j=\frac{i}{\gcd(i,x_j)}\)。对于一个 \(y_j\),有多少个满足要求的 \(x_j\) 呢?

\[\frac{i}{\gcd(i,x_j)}=y_j\\
\gcd(i,x_j)=\frac{i}{y_j}\\
\gcd(y_j,\frac{x_j}{y_j})=1\\
\]

  所以有 \(\varphi(y_j)\) 个。

\[ans=\sum_{i=1}^n\sum_{y_1,y_2,\ldots,y_m\mid i}\varphi(y_1)\varphi(y_2)\cdots\varphi(y_m)\frac{i}{\gcd(y_1,y_2,\ldots,y_m)}
\]

  记

\[f(n)=\sum_{y_1,y_2,\ldots,y_m\mid n}\varphi(y_1)\varphi(y_2)\cdots\varphi(y_m)\frac{n}{\gcd(y_1,y_2,\ldots,y_m)}
\]

  容易发现 \(f(n)\) 是积性函数。

\[f(p^k)=\sum_{i=0}^kp^{k-i}\sum_{j=i}^k\mu(\frac{j}{i})g(j)\\
=\sum_{j=0}^kg(j)\sum_{i=0}^jp^{k-i}\mu(\frac{j}{i})\\
g(j)=\begin{cases}
p^{km}&,j=1\\
(p^k-p^{j-1})^m&,2\leq j\leq k
\end{cases}\\
\]

\[f(p^k)=\sum_{x_1,x_2,\ldots,x_m=1}^{p^k}lcm(\gcd(p^k,x_1),\gcd(p^k,x_2),\ldots,\gcd(p^k,x_m))\\
=\sum_{x_1,x_2,\ldots,x_m=0}^{k}p^{\max(x_1,x_2,\ldots,x_m)}\prod_{j=1}^m\varphi(p^{k-x_j})\\
=\sum_{i=0}^kp^i(g(i)-g(i-1))\\
g(i)=\sum_{x_1,x_2,\dots,x_m=0}^i\prod_{j=1}^m\varphi(p^{k-x_j})\\
=\prod_{j=1}^m(\sum_{l=0}^i\varphi(p^{k-l}))\\=
\begin{cases}
p^{km}&,i=k\\
(p^k-p^{k-1-i})^m&,0\leq i<k
\end{cases}\\
f(p^{k+1})=p^mf(p^k)-p^k(p^{(k+1)m}-(p^{k+1}-1)^m)+p^{k+1}(p^{(k+1)m}-(p^{k+1}-1)^m)\\
=p^mf(p^k)+p^k(p-1)(p^{(k+1)m}-(p^{k+1}-1)^m)
\]

  当 \(n\leq {10}^7\) 的时候可以线性筛算出 \(f(1)\sim f(n)\)。

  时间复杂度:\(O(n(1+\frac{\log m}{\log n}))\)

  当 \(n\) 大的时候:

\[f(p)=g(0)+pg(1)-pg(0)\\
=(1-p)(p-1)^m+p^{m+1}\\
=p^{m+1}-(p-1)^{m+1}\\
=-\sum_{i=0}^m{(-1)}^{m+1-i}p^i\binom{m+1}{i}\\
=\sum_{i=0}^m{(-1)}^{m-i}p^i\binom{m+1}{i}
\]

  就可以上 min_25 筛了。

  时间复杂度:\(O(\frac{n^{\frac{3}{4}}}{\log n}m+\sqrt nm^2)\)

代码

  这个代码有些东西没有预处理,时间复杂度可能比上面写的高一些。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<functional>
  7. #include<cmath>
  8. #include<vector>
  9. #include<assert.h>
  10. //using namespace std;
  11. using std::min;
  12. using std::max;
  13. using std::swap;
  14. using std::sort;
  15. using std::reverse;
  16. using std::random_shuffle;
  17. using std::lower_bound;
  18. using std::upper_bound;
  19. using std::unique;
  20. using std::vector;
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. typedef double db;
  24. typedef std::pair<int,int> pii;
  25. typedef std::pair<ll,ll> pll;
  26. void open(const char *s){
  27. #ifndef ONLINE_JUDGE
  28. char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
  29. #endif
  30. }
  31. void open2(const char *s){
  32. #ifdef DEBUG
  33. char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
  34. #endif
  35. }
  36. int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
  37. void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
  38. int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
  39. int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
  40. const ll p=1000000007;
  41. ll fp(ll a,ll b)
  42. {
  43. ll s=1;
  44. for(;b;b>>=1,a=a*a%p)
  45. if(b&1)
  46. s=s*a%p;
  47. return s;
  48. }
  49. int n,m;
  50. namespace gao1
  51. {
  52. const int N=10000010;
  53. int f[N];
  54. int pw[N];
  55. bool b[N];
  56. int pri[N];
  57. int c[N];
  58. int cnt;
  59. void gao()
  60. {
  61. f[1]=1;
  62. pw[1]=1;
  63. for(int i=2;i<=n;i++)
  64. {
  65. if(!b[i])
  66. {
  67. pri[++cnt]=i;
  68. pw[i]=fp(i,m);
  69. }
  70. for(int j=1;j<=cnt&&i*pri[j]<=n;j++)
  71. {
  72. b[i*pri[j]]=1;
  73. pw[i*pri[j]]=(ll)pw[i]*pw[pri[j]]%p;
  74. if(i%pri[j]==0)
  75. break;
  76. }
  77. }
  78. for(int i=2;i<=n;i++)
  79. {
  80. if(!b[i])
  81. {
  82. c[i]=i;
  83. f[i]=fp(i,m+1)-fp(i-1,m+1);
  84. }
  85. for(int j=1;j<=cnt&&pri[j]<=i&&i*pri[j]<=n;j++)
  86. {
  87. int v=i*pri[j];
  88. if(i%pri[j]==0)
  89. {
  90. c[v]=c[i]*pri[j];
  91. if(c[v]==v)
  92. f[v]=((ll)pw[pri[j]]*f[i]+(ll)i*(pri[j]-1)*(pw[v]-pw[v-1]))%p;
  93. else
  94. f[v]=(ll)f[c[v]]*f[v/c[v]]%p;
  95. break;
  96. }
  97. c[v]=pri[j];
  98. f[v]=(ll)f[i]*f[pri[j]]%p;
  99. }
  100. }
  101. ll ans=0;
  102. for(int i=1;i<=n;i++)
  103. ans+=f[i];
  104. ans=(ans%p+p)%p;
  105. printf("%lld\n",ans);
  106. }
  107. }
  108. namespace gao2
  109. {
  110. const int N=100010;
  111. ll inv[N],fac[N],ifac[N];
  112. ll binom(int x,int y)
  113. {
  114. return x>=y&&y>=0?fac[x]*ifac[y]%p*ifac[x-y]%p:0;
  115. }
  116. int _;
  117. int b[N],pri[N],cnt;
  118. void init()
  119. {
  120. inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
  121. for(int i=2;i<=100000;i++)
  122. {
  123. inv[i]=-p/i*inv[p%i]%p;
  124. fac[i]=fac[i-1]*i%p;
  125. ifac[i]=ifac[i-1]*inv[i]%p;
  126. }
  127. for(int i=2;i<=_;i++)
  128. {
  129. if(!b[i])
  130. pri[++cnt]=i;
  131. for(int j=1;j<=cnt&&i*pri[j]<=_;j++)
  132. {
  133. b[i*pri[j]]=1;
  134. if(i%pri[j]==0)
  135. break;
  136. }
  137. }
  138. }
  139. ll pw[N],s[N];
  140. void init(int x)
  141. {
  142. pw[1]=1;
  143. for(int i=2;i<=x+2;i++)
  144. {
  145. if(!b[i])
  146. pw[i]=fp(i,x);
  147. for(int j=1;j<=cnt&&i*pri[j]<=n&&pri[j]<=i;j++)
  148. {
  149. pw[i*pri[j]]=pw[i]*pw[pri[j]]%p;
  150. if(i%pri[j]==0)
  151. break;
  152. }
  153. }
  154. for(int i=1;i<=x+2;i++)
  155. s[i]=(s[i-1]+pw[i])%p;
  156. }
  157. ll pre[N],suf[N];
  158. ll calc(int x,int y)
  159. {
  160. if(x<=y+2)
  161. return s[x];
  162. pre[0]=1;
  163. for(int i=1;i<=y+2;i++)
  164. pre[i]=pre[i-1]*(x-i)%p;
  165. suf[y+3]=1;
  166. for(int i=y+2;i>=1;i--)
  167. suf[i]=suf[i+1]*(x-i)%p;
  168. ll res=0;
  169. for(int i=1;i<=y+2;i++)
  170. res=(res+s[i]*pre[i-1]%p*suf[i+1]%p*ifac[i-1]%p*ifac[y+2-i]%p*((y+2-i)&1?-1:1))%p;
  171. return res;
  172. }
  173. ll s1[N],s2[N],ans1[N],ans2[N];
  174. void gao(int x)
  175. {
  176. init(x);
  177. calc(3,x);
  178. for(int i=1;i<=_;i++)
  179. s1[i]=(fp(i,x)+s1[i-1])%p;
  180. for(int i=1;n/i>_;i++)
  181. s2[i]=calc(n/i,x);
  182. for(int i=1;i<=cnt;i++)
  183. {
  184. ll v=fp(pri[i],x);
  185. int j;
  186. for(j=1;n/j/pri[i]>_&&n/j>=(ll)pri[i]*pri[i];j++)
  187. s2[j]=(s2[j]-v*(s2[j*pri[i]]-s1[pri[i]-1]))%p;
  188. for(;n/j>_&&n/j>=(ll)pri[i]*pri[i];j++)
  189. s2[j]=(s2[j]-v*(s1[n/j/pri[i]]-s1[pri[i]-1]))%p;
  190. for(j=_;j>=(ll)pri[i]*pri[i];j--)
  191. s1[j]=(s1[j]-v*(s1[j/pri[i]]-s1[pri[i]-1]))%p;
  192. }
  193. }
  194. ll g(int z,int x,int y)
  195. {
  196. if(z<0)
  197. return 0;
  198. return z==y?fp(x,(ll)y*m):fp(fp(x,y)-fp(x,y-z-1),m);
  199. }
  200. ll get(int x,int y)
  201. {
  202. ll res=0;
  203. for(int i=0;i<=y;i++)
  204. res=(res+fp(x,i)*(g(i,x,y)-g(i-1,x,y)))%p;
  205. return res;
  206. }
  207. ll solve(ll x,int y)
  208. {
  209. if(x<=1||x<pri[y])
  210. return 0;
  211. if(y>cnt)
  212. return (x<=_?ans1[x]:ans2[n/x])-ans1[_];
  213. ll res=(x<=_?ans1[x]:ans2[n/x])-ans1[pri[y]-1];
  214. for(int i=y;i<=cnt&&(ll)pri[i]*pri[i]<=x;i++)
  215. {
  216. ll x1=x/pri[i];
  217. for(int j=1;x1>=pri[i];j++,x1/=pri[i])
  218. res=(res+solve(x1,i+1)*get(pri[i],j)+get(pri[i],j+1))%p;
  219. }
  220. return res;
  221. }
  222. void gao()
  223. {
  224. _=sqrt(n)+0.5;
  225. init();
  226. for(int i=0;i<=m;i++)
  227. {
  228. gao(i);
  229. ll v=binom(m+1,i)*((m-i)&1?-1:1);
  230. for(int i=1;i<=_;i++)
  231. ans1[i]=(ans1[i]+v*s1[i])%p;
  232. for(int i=1;n/i>_;i++)
  233. ans2[i]=(ans2[i]+v*s2[i])%p;
  234. }
  235. ll ans=solve(n,1);
  236. ans++;
  237. ans=(ans%p+p)%p;
  238. printf("%lld\n",ans);
  239. }
  240. }
  241. int main()
  242. {
  243. open("c");
  244. scanf("%d%d",&n,&m);
  245. if(n<=1e7)
  246. gao1::gao();
  247. else
  248. gao2::gao();
  249. return 0;
  250. }

【UOJ448】【集训队作业2018】人类的本质 min_25筛的更多相关文章

  1. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  2. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  3. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  4. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  5. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  6. 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

  7. [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  8. UOJ#422. 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  9. UOJ#428. 【集训队作业2018】普通的计数题

    #428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...

随机推荐

  1. Docker 容器镜像删除

    1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker ...

  2. 38.QT-QAxObject快速写入EXCEL示例

    参考链接:https://blog.csdn.net/czyt1988/article/details/52121360 http://blog.sina.com.cn/s/blog_a6fb6cc9 ...

  3. http header Content-Type之常用三种

    Content-Type 用于指示资源的MIME类型 在响应头中,告诉客户端实际返回内容的类型 在请求头中,告诉服务器实际发送的数据类型 句法: Content-Type: text/html; ch ...

  4. vue+原生JavaScript实现slideDown与slideUp[简单思路]

    整个代码如下: <template> <div style="width:400px;margin:100px auto;"> <div class= ...

  5. jQuery中的动画方法

    对角线动画 hide():显示 可以写两个参数——第一个参数 数字类型:毫秒 字符串类型: slow:慢 600ms  normal:比slow快   比fast慢   400ms  fast:快   ...

  6. arcgis api 3.x for js 实现克里金插值渲染图不依赖 GP 服务(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. Netty 核心容器之ByteBuf 结构详解

    原文链接 Netty 核心容器之ByteBuf 结构详解 代码仓库地址 Java的NIO模块提供了ByteBuffer作为其字节存储容器,但是这个类的使用过于复杂,因此Netty实现了ByteBuf来 ...

  8. 商米D1S一体机设置搜狗手写输入法图解

    按照下图步骤,一步步设置即可,询问全新的时候需要点击允许. 商米应用市场搜索下载搜狗输入法,并安装 安装完成后,点击桌面搜狗输入法,选择启用搜狗输入法,如图 点击启用后,在虚拟键盘中选择搜狗输入法,并 ...

  9. SQLServer之创建不可重复读

    创建不可重复读注意事项 语法:set transaction isolation level repeatable read. 指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都 ...

  10. win7 wifi热点设置

    1.创建wifi热点 netsh wlan set hostednetwork mode=allow ssid=pengyanPC key=11111111 2.启动wifi热点 netsh wlan ...