bzoj 1101: [POI2007]Zap
2016-05-02 23:14
316 查看
1101: [POI2007]Zap
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1988 Solved: 753
[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)接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d。(1<=d<=a,b<=50000)
Output
对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。Sample Input
24 5 2
6 4 3
Sample Output
32
//对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(
6,3),(3,3)。
HINT
Source
[Submit][Status][Discuss]
题解:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define ll long long #define N 50000 using namespace std; int mu[N+3],prime[N+3],pd[N+3]; int n,m,t,a,b,d,sum[N+3]; void calc() { mu[1]=1; sum[1]=mu[1]; for (int i=2;i<=N;i++) { if (!pd[i]) { prime[++prime[0]]=i; mu[i]=-1; } for (int j=1;j<=prime[0];j++) { if (i*prime[j]>N) break; pd[i*prime[j]]=1; if (i%prime[j]==0) { mu[i*prime[j]]=0; break; } else mu[i*prime[j]]=-mu[i]; } sum[i]=sum[i-1]+mu[i]; } } int main() { scanf("%d",&t); calc(); for (int T=1;T<=t;T++) { scanf("%d%d%d",&a,&b,&d); if (a>b) swap(a,b); a/=d; b/=d; int j=0; int ans=0; for (int i=1;i<=a;i=j+1) { j=min(a/(a/i),b/(b/i)); ans=ans+(sum[j]-sum[i-1])*(a/i)*(b/i); } printf("%d\n",ans); } return 0; }
相关文章推荐
- 【裸奔吧linux】netstat: 显示网络连接,路由表,接口统计信息,多播成员
- Precision,Recall和F1
- java对redis的操作
- SDUT 2168 Mathmen(贪心)
- linux 中 alias 命令用法
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition)-B. Little Artem and Grasshopper(模拟)
- 完全卸载mysql数据库
- leetcode_096 Unique Binary Search Trees
- 宽字符和字符
- SQL语句命令
- OC里面的类类型
- 10周机电大作业设计
- 【翻译】使用nginx作为反向代理服务器,uWSGI作为应用服务器来部署flask应用
- [LeetCode#3][C]Longest Substring Without Repeating Characters
- django框架从零开始_001_安装
- HTML中鼠标滚轮事件onmousewheel
- C++中创建临时对象的情况
- 【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 后缀自动机
- RX
- Android:EditText限制文字输入