这是T2。

  一个容斥(其实也可以欧拉反演做,但是我不会)。

  首先开一个桶,记录第i行的j有多少个。

  然后枚举1~\(maxn\),枚举他的值域内的倍数,记录倍数在第i行有多少个,将个数记录在\(c[i][j]\)里

  然后计算对每个j\(\prod_{i=1}^{n}(c[i][j]+1)\)

  这个式子的意义是他的倍数的选法方案数,其中加一表示这一行不选的情况,展开后有一个1的常数项表示所有行都不选,是非法的,要减掉。

  所以最终的方案数是他减一。

  这是他倍数的选择方案,其中包括了以他为\(gcd\)的方案以及以他的倍数为\(gcd\)的方案。

  所以要计算出以他的倍数为\(gcd\)的方案后在减掉才是以j为\(gcd\)的方案数,这一过程是逆推,对于一些i来说他的所有倍数(1倍除外)都不在值域内,他们的连乘结果就是以他们为\(gcd\)的方案数,可以以他们为起点逆推。

Code
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
#define rr register
typedef long long ll;
const int inf=INT_MAX;
const int mod=1e9+7;
const int M=1e5+4;
const int N=22;
int n,m,maxn=-inf;
ll ton[N][M],cnt[N][M],c[M];
template<typename type>
inline type cmax(rr type x,rr type y){return x>y?x:y;}
int read()
{
rr int x_read=0,y_read=1;
rr char c_read=getchar();
while(c_read<'0'||c_read>'9')
{
if(c_read=='-') y_read=-1;
c_read=getchar();
}
while(c_read<='9'&&c_read>='0')
{
x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
c_read=getchar();
}
return x_read*y_read;
}
};
using namespace STD;
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int a=read();
ton[i][a]++;
maxn=cmax(maxn,a);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=maxn;j++)
for(int k=1;k*j<=maxn;k++)
cnt[i][j]+=ton[i][k*j];
for(rr int i=1;i<=maxn;i++)
{
c[i]=1ll;
for(rr int j=1;j<=n;j++)
c[i]=(c[i]*(cnt[j][i]+1))%mod;
c[i]--;
}
for(int i=maxn;i;i--)
for(int j=2;j*i<=maxn;j++)
c[i]=(c[i]-c[i*j]+mod)%mod;
ll ans=0ll;
for(rr int i=1;i<=maxn;i++)
ans=(ans+c[i]*i%mod)%mod;
printf("%lld\n",ans);
}

NOIP模拟38:b的更多相关文章

  1. Noip模拟38 2021.8.13

    T1 a 跟入阵曲很像,但是忘记入阵曲这题的思路是什么了 这里再提一下,入阵曲是子矩阵和是$k$的倍数,这道题目是子矩阵和是在一段区间内$[L,R]$ 因为这道题$n$特别小,$m$较大,考虑复杂度为 ...

  2. 2021.8.13考试总结[NOIP模拟38]

    T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...

  3. NOIP模拟 38

    liu_runda的题! 错过辽QAQ T1虽然没用题解的损益法,但是用高精%还能过.. 没想到敲完就过编译了,还以为要调一天呢 高精度的阴影没了- T2的思路很巧妙 首先一个区间最多有一种颜色占一半 ...

  4. NOIP 模拟 $38\; \rm c$

    题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过 ...

  5. NOIP 模拟 $38\; \rm b$

    题解 \(by\;zj\varphi\) 考虑转化问题,将计算最大公约数换为枚举最大公约数. 设 \(sum_i\) 为最大公约数为 \(i\) 的方案数,可以容斥求解,\(sum_i=f_i-\su ...

  6. NOIP 模拟 $38\; \rm a$

    题解 \(by\;zj\varphi\) 压行. 枚举两行,将中间的行压成一行,然后直接前缀和加二分. 注意边界细节问题. Code #include<bits/stdc++.h> #de ...

  7. noip模拟38

    \(\color{white}{\mathbb{深秋总有廖落处,雁归每是菊败时,名之以:残菊}}\) 这场比赛几乎全场都在打暴力,几乎人均切掉的 \(t1\) 没有想到双指针,\(t3\) 的暴力也没 ...

  8. NOIP模拟38:a

      这是T1.   考场上思路与正解就差个前缀,打的线段树,因为其巨大常数快乐挂掉......   正解复杂度是\(O(n^2m)\),其实再挂个\(log\)也能过,但是需要用常数极其优秀的树状数组 ...

  9. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

随机推荐

  1. 🔥 LeetCode 热题 HOT 100(41-50)

    102. 二叉树的层序遍历 思路:使用队列. /** * Definition for a binary tree node. * public class TreeNode { * int val; ...

  2. Linux 基础指令初识

    Linux 基础指令初识 01. ls 指令 语法: ls [选项] [目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件.对于文件,将列出文件名以及其他信息 -a 列出目录下的所有文 ...

  3. 字节跳动已经10万人了?渣本双非Android程序员怎么上车?

    字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...

  4. A Telnet Client Using Expect

    The following expect script achieves a simple telnet client: login -> send command -> exit. Th ...

  5. 《微服务架构设计模式》读书笔记 | 第4章 使用Saga管理事务

    目录 前言 1. 微服务架构下的事务管理 1.1 分布式事务的挑战 1.2 一个Saga的示例 1.3 Saga使用补偿事务来回滚所作出的改变 2. Saga的协调模式 2.1 两种Saga协调模式 ...

  6. Required request body is missing-请求接口报错

    一.问题由来 自己目前在做一个小程序的后台,已经写好了项目中的很多的接口,同时也在进行一些修改,比如添加拦截器,统一校验一个固定的参数是否正确. 在自己添加拦截器之前,这些接口都可以正常访问,可是在添 ...

  7. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

  8. NOIP 模拟 $19\; \rm u$

    题解 \(by\;zj\varphi\) 二维差分的题目 维护两个标记,一个向下传,一个向右下传: 对于每次更新,我们可以直接更新 \((r,c)+s,(r+l,c)-s\) ; \((r,c+1)- ...

  9. sentinel使用(结合gateway)

    前 如果你想在Spring Cloud Gateway中使用Sentinel Starter,你需要添加Spring - Cloud -alibaba- Sentinel - Gateway依赖,并添 ...

  10. 堆排序——Java实现

    一.堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 二.堆 什 ...