紫书 例题 10-27 UVa 10214(欧拉函数)
2024-10-02 08:10:47
只看一个象限简化问题,最后答案乘4+4
象限里面枚举x, 在当前这条固定的平行于y轴的直线中
分成长度为x的一段段。符合题目要求的点gcd(x,y) = 1
那么第一段1<= y <= x,个数为phi(x)个,即是x的欧拉函数值
第二段x+1 <= y <= 2x, 因为gcd(x + i, x) = gcd(x, i)
接下来同理
一直到最后一段
kx + 1 <= y <= b要单独一个个算,因为最后一段的长度不一定为x
感觉这道题算每一条直线时分成长度为x的一段段很巧妙,不好想到
#include<cstdio>
#include<cmath>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
typedef long long ll;
int phi(int n)
{
int ans = n;
for(int i = 2; i * i <= n; i++)
if(n % i == 0)
{
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
ll f(int a, int b)
{
ll ans = 0;
REP(x, 1, a + 1)
{
int k = b / x;
ans += phi(x) * k;
REP(y, k*x + 1, b + 1)
if(gcd(x, y) == 1)
ans++;
}
return 4 * ans + 4;
}
int main()
{
int a, b;
while(~scanf("%d%d", &a, &b) && a)
{
ll K = f(a, b);
ll N = (ll)(2 * a + 1) * (2 * b + 1) - 1;
printf("%.7lf\n", (double)K / N);
}
return 0;
}
最新文章
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
- 重构第14天 分离职责(Break Responsibilities)
- 李洪强iOS开发之零基础学习iOS开发【02-C语言】03-关键字、标识符、注释
- 关于tomcat不支持put方式的解决方式
- DOS批处理命令-if语句
- HBase在京东的完善与创新
- Android开发手记(25) 简单Service的实现
- MD中bitmap源代码分析--数据结构
- html系列教程--embed fieldset legend figure figurecaption
- VS2017编译SNMP++步骤记录
- WPF自定义控件(四)の自定义控件
- python服务器文件上传下载+GUI【tkinter】
- tomcat 报错处理
- 【2017-2-26】C#String类、Math类、DateTime类
- 【做题】arc070_f-HonestOrUnkind——交互+巧妙思维
- PHP开发微信公众号(一)二维码的获取
- Oracle错误代码ORA-01653,表空间容量无法扩展
- 简单CSS3动画
- [Java][Servlet] Cannot call sendRedirect() after the response has been committed
- java课程设计全程实录——第0天