[bzoj1101]Zap

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 50001
 4 int t,n,m,k,ans,mu[N],vis[N],p[N];
 5 void mobius(){
 6     mu[1]=1;
 7     for(int i=2;i<N;i++){
 8         if (!vis[i]){
 9             p[++p[0]]=i;
10             mu[i]=-1;
11         }
12         for(int j=1;i*p[j]<N;j++){
13             vis[i*p[j]]=1;
14             if (i%p[j])mu[i*p[j]]=-mu[i];
15             else{
16                 mu[i*p[j]]=0;
17                 break;
18             }
19         }
20     }
21     for(int i=1;i<N;i++)mu[i]+=mu[i-1];
22 }
23 int main(){
24     scanf("%d",&t);
25     mobius();
26     while (t--){
27         scanf("%d%d%d",&n,&m,&k);
28         n/=k;
29         m/=k;
30         ans=0;
31         for(int i=1,j;i<=min(n,m);i=j+1){
32             j=min(n/(n/i),m/(m/i));
33             ans+=(mu[j]-mu[i-1])*(n/i)*(m/i);
34         }
35         printf("%d\n",ans);
36     }
37 }

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11247985.html

时间: 2024-10-29 12:14:25

[bzoj1101]Zap的相关文章

Bzoj1101 [POI2007]Zap

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2414  Solved: 995[Submit][Status][Discuss] Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下

[BZOJ1101&amp;BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演

对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 我们可以令F[n]=使得n|(x,y)的数对(x,y)个数 这个很容易得到,只需要让x,y中都有n这个因子就好了,也就是[a/n]*[b/n]个数对(向下取整) 然后设题中所要求的为f[n],很容易得知,F[n]=∑f[d](n|d) 莫比乌斯反演可以得到f[n]=∑μ(d/n)F[d](n|d) 这样是O(n),然而数据范围5*10^4显然不能通过 f[n]=∑μ(d/n)[a/d][b/d]

BZOJ1101: [POI2007]Zap(莫比乌斯反演)

1101: [POI2007]Zap Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2951  Solved: 1293[Submit][Status][Discuss] Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1

【Poi2007】【Bzoj1101】Zap

先膜一发黄学长的题解,http://hzwer.com/4205.html 来一步步推 令a'=a/d b'=b/d 首先,原来要求的东西= 再利用莫比乌斯函数的性质可以得出 这里需要用到分块的思想,具体看程序里. 个人觉得(a/(a/i))非常妙 接下来问题就变成了一段段连续的了, 维护莫比乌斯函数的前缀和,就好了 1 #include<cstdio> 2 #include<algorithm> 3 #define ll long long 4 using namespace s

【莫比乌斯反演】BZOJ1101 [POI2007]zap

Description 回答T组询问,有多少组gcd(x,y)=d,x<=a, y<=b.T, a, b<=4e5. Solution 显然对于gcd=d的,应该把a/d b/d,然后转为gcd=1计算 计算用莫比乌斯反演相信大家都会 关键是有T组询问n^2会T 于是有这样一个优化可以做到每次sqrt(n) 每一次是ret+=mu[i]*(n/i)*(m/i) 可是除法向下取整所以会导致很多i的(n/i)*(m/i)一样 具体来说,向下取整得到的结果一定是约数所以对于(n/i)最多2sq

bzoj 1101 [POI2007]Zap - 莫比乌斯反演

Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个 正整数,分别为a,b,d.(1<=d<=a,b<=50000) Output 对于每组询问,输出到输出文件zap.out一个正

bzoj1101

1101: [POI2007]Zap Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2319  Solved: 936[Submit][Status][Discuss] Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1

bzoj 1101 zap 莫比乌斯

1101: [POI2007]Zap Time Limit: 10 Sec  Memory Limit: 162 MB Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d.(

【BZOJ】1101: [POI2007]Zap(莫比乌斯+分块)

http://www.lydsy.com/JudgeOnline/problem.php?id=1101 无限膜拜数论和分块orz 首先莫比乌斯函数的一些性质可以看<初等数论>或<具体数学>或贾志鹏的<线性筛法和积性函数> 我写一些笔记啥的吧.. 首先莫比乌斯函数的定义及一些性质(免去证明): $$\mu (n) =\begin{cases}1 & n=1\\(-1)^k & n=p_1p_2 \cdots p_k,质因子指数均为1且互不相同 \\0 &