BZOJ 2818: Gcd( 欧拉函数 )
2015-07-28 12:39
417 查看
要求gcd(x, y) = p (1 <= x, y <= n, p为质数 ) 的数对(x, y)个数.我们枚举素数p, 令x' = x / p, y' = y / p, 则只须求 f(p) = gcd(x', y') = 1的数对(x', y')个数(1 <= x', y' <= n / p), 显然f(p) = (∑ phi(x')) * 2 - 1(1 <= x' <= n / p). 所以最后答案为 ∑f(p)
-------------------------------------------------------------------
#include<bits/stdc++.h> #define clr(x, c) memset(x, c, sizeof(x))#define rep(i, n) for(int i = 0; i < n; ++i)#define foreach(i, x) for(__typeof(x.begin()) i = x.begin(); i != x.end(); i++) using namespace std; typedef long long ll; const int maxn = 10000009; int prime[maxn], N = 0, n;ll phi[maxn], ans = 0;bool check[maxn]; void init() { clr(check, 0); phi[1] = 1; for(int i = 2; i <= n; i++) { if(!check[i]) { prime[N++] = i; phi[i] = i - 1; } for(int j = 0; j < N && prime[j] * i <= n; j++) { check[prime[j] * i] = true; if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1); else { phi[i * prime[j]] = phi[i] * prime[j]; break; } } }} int main() { freopen("test.in", "r", stdin); cin >> n; init(); for(int i = 2; i <= n; i++) phi[i] += phi[i - 1]; rep(i, N) ans += phi[n / prime[i]] * 2 - 1; cout << ans << "\n"; return 0;}-------------------------------------------------------------------
2818: Gcd
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2450 Solved: 1086
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
Input
一个整数NOutput
如题Sample Input
4Sample Output
4HINT
hint对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
Source
湖北省队互测相关文章推荐
- 配置Exchange 2013恶意软件筛选器
- 加速Android Studio/Gradle构建
- hadoop实现kmeans二
- JSPatch 实现原理详解
- asp.net mvc下标记一个action同时可以接受httpget和httppost
- 消息映射机制
- 对程序员非常重要的24个软技能
- iOS开发系列–音频播放、录音、视频播放、拍照、视频录制
- Java对象的相等性判断:equasl( )方法 与 ==操作符
- 。。
- 多线程互斥锁Pthread_mutex_t
- HDU 1003 Max Sum
- [leetcode-26]Remove Duplicates from Sorted Array(C)
- Docker支持集群分布式应用意义很重大
- 在编译过程中出现未定义符号处理方法
- python3入门之字符串
- 载入动画
- Java时间差及时间比较
- MFC创建线程函数及参数的使用
- MFC如何设置拖动对话框