IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解
Xtreme 10.0 - Inti Sets
题目来源 第10届IEEE极限编程大赛
https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/inti-sets
In order to motivate his Peruvian students, a teacher includes words in the Quechua language in his math class.
Today, he defined a curious set for a given positive integer N. He called this set, an Inti set, and defined it as the set of all positive integer numbers that have the number 1 as their single common positive divisor with number N.
The math class about Inti sets was amazing. After class, the students try to challenge to teacher. They each ask questions like this: "Could you tell me the sum of all numbers, between A and B (inclusive), that are in the Inti set of N?"
Since the teacher is tired and he's sure that you are the best in class, he wants to know if you can help him.
Input Format
The first line of input contains an integer Q, 1 ≤ Q ≤ 20, representing the number of students. Each of the next Qlines contain three space-separated integers N, A and B, which represent a query.
Constraints
1 ≤ A ≤ B ≤ N ≤ 10^12
Output Format
The output is exactly Q lines, one per student query. For each query you need to find the sum of all numbers between A and B, that are in the Inti set of N, and print the sum modulo 1000000007.
Sample Input
2
12 5 10
5 1 4
Sample Output
12
10
Explanation
In the sample input, Q = 2, so you have to answer two questions:
In the first question N = 12, A = 5 and B = 10. So you have to find the sum of all numbers between 5 and 10, that are in the Inti set of 12.
Inti set ( 12 ) = { 1, 5, 7, 11, 13, ... }
2 and 4 are not in the Inti set (12) because 12 and these numbers are also divisible by 2.
3 and 9 are not in the Inti set (12) because 12 and these numbers are also divisible by 3.
The numbers in the Inti set, which are in the query's range, are 5 and 7, so answer is ( 5 + 7 ) MOD 1000000007 = 12
In the second question, the numbers in the Inti set of 5 between 1 and 4 are: 1, 2, 3, 4; so the answer is ( 1 + 2 + 3 + 4 ) MOD 1000000007 = 10
题目解析
显然直接求和会超时,可以用容斥原理解决。
用sumOver(5, 10, 1)表示区间[5,10]内为1倍数的数
由于12的质因数为2, 3
sum(区间[5, 10]内与12互质的数) = sumOver(5, 10, 1) - sumOver(5, 10, 2) - sumOver(5, 10, 3) + sumOver(5, 10, 6)
可以通过遍历区间[0,2^2)的每一个数来遍历所有因式的组合,
二进制数形式每一位代表是否存在该因数,1代表存在,0代表不存在,
因数的个数为偶数意味着和需要加上,为奇数意味着需要减去
00代表因数为1, 01代表因数为3, 10代表因数为2, 11代表因数为6
注意需要使用取余运算避免溢出。
复杂度分析
如果有c个质因数,那么需要求2^c个数的和
求每一个和需要常数时间O(1)
数N,至多只有一个大于sqrt(N)的质因数,因此质因数的个数不超过log(sqrt(N))+1
总复杂度为O(sqrt(N))
程序
C++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; #define MAXN 1000000007 // 区间[a,b]内,所有为x倍数数的和
long long sumOver(long long a, long long b, long long x) {
long long aa = (a + x - ) / x; // 上取整
long long bb = b / x; // 下取整 long long sum; // sum会超过long long的表示范围
if( (aa + bb) % == ) {
sum = (((aa + bb) / ) % MAXN) * ((bb - aa + ) % MAXN);
} else {
sum = ((aa + bb) % MAXN) * (((bb - aa + ) / ) % MAXN);
} return ((sum % MAXN) * (x % MAXN)) % MAXN;
} // 求不大于max的所有素数
// 使用筛选法
void getPrimes(vector<long long> &primes, long long max) {
vector<bool> nums(max, );
for(long long i=; i<max; i++) {
if(nums[i] == false) {
primes.push_back(i);
for(int n=*i; n<max; n+=i) {
nums[n] = true;
}
}
}
} // 对数x进行质因数分解
void getFactors(long long x, vector<long long> &factors, vector<long long> &primes) {
int i = ;
while(x > && i < primes.size()) {
if(x % primes[i] == ) {
factors.push_back(primes[i]);
while(x % primes[i] == ) x /= primes[i];
}
i++;
}
// 小于10^12的数最对有一个大于10^6的质因数
if(x > ) {
factors.push_back(x);
}
} int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
vector<long long> primes;
getPrimes(primes, ); int T;
cin >> T;
for(int t=; t<T; t++) {
long long x, a, b;
cin >> x >> a >> b;
long long result = ;
vector<long long> factors;
getFactors(x, factors, primes); int factorCount = factors.size();
long long binMax = (long long) << factorCount; // 遍历所有的质因数组合
for(long long bin=; bin<binMax; bin++) {
long long factor = ;
int factorC = ;
for(int i=; i<factorCount; i++) {
if( (bin >> i) & ) {
factor *= factors[i];
factorC ++;
}
} if(factorC % == ) {
result = (result + sumOver(a, b, factor) + MAXN) % MAXN;
}
else {
result = (result - sumOver(a, b, factor) + MAXN) % MAXN;
}
} cout << result << endl;
} return ;
}
IEEEXtreme 10.0 - Inti Sets的更多相关文章
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
- IEEEXtreme 10.0 - Playing 20 Questions with an Unreliable Friend
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Playing 20 Questions with an Unreliable Friend 题目来源 第1 ...
- IEEEXtreme 10.0 - Full Adder
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Full Adder 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank. ...
- IEEEXtreme 10.0 - N-Palindromes
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...
- IEEEXtreme 10.0 - Mysterious Maze
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Mysterious Maze 题目来源 第10届IEEE极限编程大赛 https://www.hacker ...
随机推荐
- 驱动之LCD的介绍与应用20170209
本文主要介绍的是LCD的介绍与应用,直接看个人笔记即可:
- OpenCV(C++版)图像读取,创建,复制,保存,显示
http://blog.163.com/yuyang_tech/blog/static/21605008320132642254689/ 一个小例子: #include "stdafx.h& ...
- shell 脚本判断linux 的发行版本
原文vi ./Get_Dist_Name.sh #!/bin/bash Get_Dist_Name() { if grep -Eqii "CentOS" /etc/issue || ...
- (转) 使用vivado创建工程 4[完结]
由于自己手头暂时没有开发板,因此本节没有测试,故告之. Connecting to ZedBoardBefore we can run the application we have to conne ...
- CentOS7,安装Tomcat8.5、JDK1.8,并设置开机启动(Linux CentOS Tomcat、JDK+Tomcat、Tomcat开机自启动)
1.下载JDK1.8.Tomcat8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- 基础但是很重要的2-sat POJ 3678
http://poj.org/problem?id=3678 题目大意:就是给你n个点,m条边,每个点都可以取值为0或者1,边上都会有一个符号op(op=xor or and三种)和一个权值c.然后问 ...
- 重构改善既有代码设计--重构手法13:Inline Class (将类内联化)
某个类没有做太多事情.将这个类的所有特性搬移到另一个类中,然后移除原类. 动机:Inline Class (将类内联化)正好于Extract Class (提炼类)相反.如果一个类不再承担足够责任.不 ...
- 使用CSS3+JQuery打造自定义视频播放器
简介 HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发 ...
- 无废话JavaScript(下)
五.函数式 这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们. 其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实 ...
- 第七周 ch04 课下测试补交
2017-2018-1 20155335 <信息安全系统设计基础>第7周 课下测试博客 本人不慎忘记去交dao'zhi 测试题目: SEQ+对SEQ的改变有() A . PC的计算挪到取指 ...