\(Description\)

给定 \(n\) 个正整数序列 ,每个序列长度为 \(m\)。

选择至少 \(1\) 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 \(\gcd\)。

求所有方案的结果之和,答案对 \(1e9+7\) 取模。两种方案不同,当且仅当存在至少一个元素,在一种方案中被选择,在另一种中没有。

\(Input\)

第一行,两个正整数 \(n,m\)。

接下来 \(n\) 行,每行 \(m\) 个正整数,第 \(i\) 行代表序列 。

\(Output\)

第一行,一个整数,代表答案对 \(1e9+7\) 取模的结果。

解析

一道比较难的莫比乌斯反演题,要用到其中的性质,且按套路行事技巧处很多

最后推出的是一个关于欧拉函数的式子,莫比乌斯不见了

好,现在进行套路推导

先设 \(f(x)\) 表示选择至少一个序列,在每个被选择的序列选择一个元素,它们的 \(\gcd = x\) 的方案数。

则易得

\[f(x)=\prod_{i=1}^n(\sum_{j=1}^m [a_{i,j}=x]+1)-1
\]

然后套路 \(F(x)\) 表示同 \(f(x)\) 但涵盖了 \(x\) 的倍数,即

\[F(x)=\sum_{x|d}f(d)=\sum_{x|d}(\prod_{i=1}^n(\sum_{j=1}^m [a_{i,j}=d]+1)-1)
\]

然后我们发现,我们先枚举 \(x\) ,再枚举其倍数 \(d\),而后面 \([a_{i,j}=d]\) 肯定是 \(x\) 的倍数,所以我们可以简化式子

\[\sum_{x|d}(\prod_{i=1}^n(\sum_{j=1}^m [a_{i,j}=d]+1)-1) = \prod_{i=1}(\sum_{j=1}^m [x|a_{i,j}]+1)-1
\]

而此时,为了日后式子的简便即实现,我们设

\(cnt_{i,x}=\sum_{j=1}^m[x|a_{i,j}]\) 表示第 \(i\) 个数列所有是 \(x\) 的倍数的数的个数

再为了枚举得到所有答案,我们设 \(lim\) 表示所有元素的最大值

然后一波推式子,反演

\[\begin{aligned}
\sum_{i=1}^{lim}if(i)
&=\sum_{i=1}^{lim}i\sum_{i|d}F(d)\mu(\frac{d}{i}) \\
&=\sum_{i=1}^{lim}i\sum_{i|d}\prod_{j=1}^n((cnt_{j,d}+1)-1)\mu(\frac{d}{i}) \\
&=\sum_{d=1}^{lim}\sum_{i|d}i\mu(\frac{d}{i})(\prod_{j=1}^n(cnt_{j,d}+1)-1)
\end{aligned}
\]

然后,然后~~~好像没戏了

但,我们有伟大的欧拉!!

\[\begin{aligned}
\varphi(n)
&=\sum_{i=1}^n[\gcd(i,n)=1] \\
&=\sum_{i=1}^n\sum_{d|gcd(i,j)}\mu(d) \\
&=\sum_{d|n}\mu(d)\frac{n}{d}
\end{aligned}
\]

哈哈哈,太棒了!

相同的一部分,代入式子

\[\begin{aligned}
\sum_{d=1}^{lim}\sum_{i|d}i\mu(\frac{d}{i})(\prod_{j=1}^n(cnt_{j,d}+1)-1)
&=\sum_{d=1}^{lim}\varphi(n)(\prod_{j=1}^n(cnt_{j,d}+1)-1)
\end{aligned}
\]

于是这题就这样了。

线性筛 \(\varphi\),预处理 \(cnt\) 数组(根据套路,不要枚举因子而是枚举倍数)。

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL; const int N = 1e5;
const LL mod = 1e9 + 7;
int lim , n , m , a[25][N + 5] , cnt[25][N + 5] , phi[N + 5] , prime[N + 5] , vis[N + 5] , tot;
LL ans; inline void getPhi()
{
phi[1] = 1;
for(register int i = 2; i <= N; i++)
{
if (!vis[i]) phi[prime[++tot] = i] = i - 1;
for(register int j = 1; j <= tot && prime[j] * i <= N; j++)
{
vis[prime[j] * i] = 1;
if (i % prime[j] == 0)
{
phi[prime[j] * i] = phi[i] * prime[j];
break;
}
phi[prime[j] * i] = phi[i] * (prime[j] - 1);
}
}
} inline void getCnt()
{
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= lim; j++)
for(register int k = 2; k * j <= lim; k++)
cnt[i][j] += cnt[i][j * k];
} int main()
{
freopen("b.in" , "r" , stdin);
freopen("b.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= m; j++)
scanf("%d" , &a[i][j]) , cnt[i][a[i][j]]++ , lim = max(lim , a[i][j]);
getPhi() , getCnt();
for(register int d = 1; d <= lim; d++)
{
LL res = 1;
for(register int j = 1; j <= n; j++) res = res * (LL)(cnt[j][d] + 1) % mod;
ans = (ans + (LL)((LL)phi[d] * (res - 1)) % mod) % mod;
}
printf("%lld" , ans);
}

JZOJ 5843.B的更多相关文章

  1. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  2. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  3. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  4. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  5. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  6. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  7. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  8. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  9. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

  10. [jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. ...

随机推荐

  1. <四>虚函数 静态绑定 动态绑定

    代码1 class Base { public: Base(int data=10):ma(data){ cout<<"Base()"<<endl; } v ...

  2. Day26:内部类的详解

    内部类 1.1内部类概述 内部类:就是在一个类中定义另外一个类. 例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类. 好比我们的手机是一个类,而手机内部的零件又属于一个类. 内 ...

  3. selenium常用配置

    def init_chrome_options(self,): chrome_options = webdriver.ChromeOptions() # 设置浏览器初始 位置x,y & 宽高x ...

  4. 10-排序6 Sort with Swap(0, i) (25point(s))

    10-排序6 Sort with Swap(0, i) (25point(s)) Given any permutation of the numbers {0, 1, 2,..., N−1}, it ...

  5. Spring IOC源码(二):IOC容器之 刷新前的准备

    1.源码解析 prepareRefresh()容器刷新refresh()的第一个方法,是容器刷新前的准备工作. 1 // 容器启动的开始时间 毫秒级 2 private long startupDat ...

  6. [ 赛后总结 ] CSP-J 2022

    前言 今年没考好,估分 100+60+0+10=170pts ,大概能混个2=,没什么用. 这下好了,期中也砸了,已经排到全校 30 开外了,果然鱼和熊掌不可兼得,况且我双双落空,接下来怕是想搞也搞不 ...

  7. Spark详解(09) - Spark调优

    Spark详解(09) - Spark调优 Spark 性能调优 常规性能调优 常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的 ...

  8. Maui Blazor 使用摄像头实现

    Maui Blazor 使用摄像头实现 由于Maui Blazor中界面是由WebView渲染,所以再使用Android的摄像头时无法去获取,因为原生的摄像头需要绑定界面组件 所以我找到了其他的实现方 ...

  9. 如何在现有的Vue项目中嵌入 Blazor项目?

    目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全 ...

  10. FalseSharing-伪共享

    1.CPU缓存 要了解什么是伪共享,首先得了解CPU缓存架构与缓存行的知识 (1)<CPU缓存架构> 主内存RAM是数据存在的地方,CPU和主内存之间有好几级缓存,因为即使直接访问主内存相 ...