bzoj2880

本文详细介绍了一个高效的数论算法实现过程,通过预处理得到莫比乌斯函数和特定函数g的前缀和,进而求解两个整数范围内特定条件的计数问题。该算法巧妙地利用了数学性质和数据结构来提高计算效率。

打公式好麻烦 QAQ  

为了节省时间去复习,原谅我引用一下别人的博客。。。http://blog.youkuaiyun.com/acdreamers/article/details/8542292

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<string>
 5 #include<cstring>
 6 #define re(i,l,r) for(int i=(l);i<=(r);i++)
 7 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
 8 using namespace std;
 9 typedef long long LL;
10 int prime[10000010],prime_tot,mu[10000010],g[10000010],sum[10000010];
11 bool bo[10000010];
12 LL solve(int n,int m)
13 {
14     LL ret=0;
15     if(n>m)swap(n,m);
16     int i=1,xia;
17     while(i<=n)
18     {
19         xia=min(n/(n/i),m/(m/i));
20         ret+=1LL*(n/i)*(m/i)*(sum[xia]-sum[i-1]);
21         i=xia+1;
22     }
23     return ret;
24 }
25 int main()
26 {
27     mu[1]=1;
28     re(i,2,10000000)
29     {
30         if(!bo[i])prime[++prime_tot]=i,mu[i]=-1,g[i]=1;
31         for(int j=1;j<=prime_tot&&i*prime[j]<=10000000;j++)
32         {
33             bo[i*prime[j]]=1;
34             if(i%prime[j]==0){mu[i*prime[j]]=0,g[i*prime[j]]=mu[i];break;}
35             else mu[i*prime[j]]=-mu[i],g[i*prime[j]]=mu[i]-g[i];
36         }
37     }
38     re(i,1,10000000)sum[i]=sum[i-1]+g[i];
39     int t;
40     scanf("%d",&t);
41     while(t--)
42     {
43         int n,m;scanf("%d%d",&n,&m);
44         printf("%lld\n",solve(n,m));
45     }
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/HugeGun/p/5339773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值