题解

代码
1 #include <cstdio>
2 #include <iostream>
3 #include <cmath>
4 using namespace std;
5 const long long mo=1e9+7,inf=1e5;
6 int n,m;
7 long long a[30][100010],mx,sum[100010][500],num[30][100010],f[100010],ans;
8 int main()
9 {
10 freopen("b.in","r",stdin);
11 freopen("b.out","w",stdout);
12 scanf("%d%d",&n,&m);
13 for (int i=1;i<=n;i++)
14 for (int j=1;j<=m;j++)
15 scanf("%lld",&a[i][j]),mx=max(a[i][j],mx);
16 for (int i=1;i<=inf;i++)
17 for (int j=1,k=sqrt(i);j<=k;j++)
18 if (i%j==0)
19 {
20 sum[i][++sum[i][0]]=j;
21 if (j*j!=i) sum[i][++sum[i][0]]=i/j;
22 }
23 for (int i=1;i<=n;i++)
24 for (int j=1;j<=m;j++)
25 for (int k=1;k<=sum[a[i][j]][0];k++)
26 num[i][sum[a[i][j]][k]]++;
27 for (int i=1;i<=mx;i++)
28 {
29 f[i]=1;
30 for (int j=1;j<=n;j++) f[i]=(f[i]*(num[j][i]+1))%mo;
31 f[i]=(f[i]-1+mo)%mo;
32 }
33 for (int i=mx;i>=1;i--)
34 {
35 for (int j=2;j<=mx/i;j++) f[i]=(f[i]-f[i*j]+mo)%mo;
36 (ans+=f[i]*i%mo)%=mo;
37 }
38 printf("%lld",ans);
39 return 0;
40 }