http://www.elijahqi.win/archives/2747 
 Description 
 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后, 
 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。 栋栋的植物种得非常整齐,一共有n列,每列 
 有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n, 
 表示是在第x列,y的范围是1至m,表示是在第x列的第y棵。 由于能量汇集机器较大,不便移动,栋栋将它放在了 
 一个角上,坐标正好是(0, 0)。 能量汇集机器在汇集的过程中有一定的能量损失。如果一棵植物与能量汇集机器 
 连接而成的线段上有k棵植物,则能量的损失为2k + 1。例如,当能量汇集机器收集坐标为(2, 4)的植物时,由于 
 连接线段上存在一棵植物(1, 2),会产生3的能量损失。注意,如果一棵植物与能量汇集机器连接的线段上没有植 
 物,则能量损失为1。现在要计算总的能量损失。 下面给出了一个能量采集的例子,其中n = 5,m = 4,一共有20 
 棵植物,在每棵植物上标明了能量汇集机器收集它的能量时产生的能量损失。 在这个例子中,总共产生了36的能 
 量损失。 
 Input 
 仅包含一行,为两个整数n和m。
Output 
 仅包含一个整数,表示总共产生的能量损失。
Sample Input 
 【样例输入1】
5 4
【样例输入2】
3 4
Sample Output 
 【样例输出1】
36
【样例输出2】
20
对于100%的数据:1 ≤ n, m ≤ 100,000。 
 观察到因为这是一个每个点长宽都为单位1的矩形 所以可以知道一个点的答案就是 
2∗gcd(i,j)−1
  
   
    
     2
    
    
     ∗
    
    
     g
    
    
     c
    
    
     d
    
    
     (
    
    
     i
    
    
     ,
    
    
     j
    
    
     )
    
    
     −
    
    
     1
    
   
 所以答案显然是∑i=1n∑i=1m2∗gcd(i,j)−1
  
   
    
     
      ∑
     
     
      
       i
      
      
       =
      
      
       1
      
     
     
      
       n
      
     
    
    
     
      ∑
     
     
      
       i
      
      
       =
      
      
       1
      
     
     
      
       m
      
     
    
    
     2
    
    
     ∗
    
    
     g
    
    
     c
    
    
     d
    
    
     (
    
    
     i
    
    
     ,
    
    
     j
    
    
     )
    
    
     −
    
    
     1
    
   将这个-1提取出来 变成n*m 
 原始式子可以写成∑d=1nd∑d′=1nd∑i=1ndd′∑j=1ndd′1
  
   
    
     
      ∑
     
     
      
       d
      
      
       =
      
      
       1
      
     
     
      
       n
      
     
    
    
     d
    
    
     
      ∑
     
     
      
       
        d
       
       
        ′
       
      
      
       =
      
      
       1
      
     
     
      
       
        n
       
       
        d
       
      
     
    
    
     
      ∑
     
     
      
       i
      
      
       =
      
      
       1
      
     
     
      
       
        n
       
       
        
         d
        
        
         
          d
         
         
          ′
         
        
       
      
     
    
    
     
      ∑
     
     
      
       j
      
      
       =
      
      
       1
      
     
     
      
       
        n
       
       
        
         d
        
        
         
          d
         
         
          ′
         
        
       
      
     
    
    
     1
    
   
 于是直接利用技巧分块+预处理前缀和求解即可请各位大佬看一下莫比乌斯的常见的套路 还有狄利克雷卷积的一些知识qwq
#include<cstdio>
#include<algorithm>
#define N 110000
#define ll long long
#define rg register
using namespace std;
int mu[N],prime[N],tot,n,m;
bool not_prime[N];
int main(){
//freopen("bzoj2005.in","r",stdin);
scanf("%d%d",&n,&m);int mx=max(n,m);mu[1]=1;
for (rg int i=2;i<=mx;++i){
if (!not_prime[i]) mu[i]=-1,prime[++tot]=i;
for (rg int j=1;prime[j]*i<=mx;++j){
not_prime[i*prime[j]]=1;
if (i%prime[j]==0){mu[i*prime[j]]=0;break;}else mu[i*prime[j]]=-mu[i];
}
}ll ans=0;int last=1;int mn=min(m,n);
for (rg int i=1;i<=mx;++i) mu[i]+=mu[i-1];
//for (rg int i=1;i<=mx;++i) printf("%d,mu[i]);puts("");
for (rg int i=1;i<=mn;++i){
ll tmp=0;
for (rg int j=1;j<=mn/i;j=last+1){
last=min((m/i)/(m/(j*i)),(n/i)/(n/(j*i)));
tmp+=(ll)(m/(j*i))*(n/(j*i))*(mu[last]-mu[j-1]);//printf("%lld\n",ans);
}ans+=i*tmp<<1;
}ans-=(ll)n*m;
printf("%lld\n",ans);
return 0;
}
                










