CDOJ 1304 Infinity Set
2016-03-27 11:02
197 查看
当两个数互质时,在枚举到一定程度后,后面一定是连续的,那如果不互质呢?同除以gcd就好了,当然,最后求第k小的时候记得在乘回来
那什么时候开始连续呢?a*b之后,为什么呢?a*1,a*2,a*3分别对b取余,一直到a*b,能把所有的余数都取一遍,然后当要表示某个数时,可以根据它取余b是多少,先减去对应的多少个a,然后剩下的就是b的整数倍了。当然,在a*b之前可能就已经连续了,但是a*b之后一定是连续的
看了看别人写的民间题解,貌似是lcm(a.b)之后,就开始连续了,想想大概确实是这样,但是,a、b互质的话,lcm(a,b)=a*b,所以一样的咯
代码:
那什么时候开始连续呢?a*b之后,为什么呢?a*1,a*2,a*3分别对b取余,一直到a*b,能把所有的余数都取一遍,然后当要表示某个数时,可以根据它取余b是多少,先减去对应的多少个a,然后剩下的就是b的整数倍了。当然,在a*b之前可能就已经连续了,但是a*b之后一定是连续的
看了看别人写的民间题解,貌似是lcm(a.b)之后,就开始连续了,想想大概确实是这样,但是,a、b互质的话,lcm(a,b)=a*b,所以一样的咯
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define maxn 25000004 bool mark[maxn]; long long num[maxn]; long long a, b, c, x, y, sum; long long gcd(long long a, long long b)//普通方法 { long long m, n, r; m = a >= b ? a : b;//m>=n n = a<b ? a : b; r = m%n; while (r != 0) { m = n; n = r; r = m%n; } return n; } void init() { long long s = x*y; long long m = s / x, n = s / y; for (int i = 0; i <= m; ++i) { n = (s - i*x) / y; for (int j = 0; j <= n; ++j) { mark[i*x + j*y] = 1; } } sum = 0; for (int i = 1; i <= s; ++i) { if (mark[i]) num[++sum] = i; } } int main() { //freopen("input.txt", "r", stdin); scanf("%lld%lld", &a, &b); c = gcd(a, b); x = a / c, y = b / c; init(); long long q; long long k, ans; scanf("%lld", &q); while (q--) { scanf("%lld", &k); if (k > sum) { ans = k - sum + num[sum]; } else ans = num[k]; ans *= c; printf("%lld\n", ans); } //system("pause"); //while (1); return 0; }
相关文章推荐
- 图解CentOS系统启动流程
- 详解c++指针的指针和指针的引用
- 简单的Ant命令
- java中HashMap详解
- 初学GraphicsView
- 【USACO 5.5.2】Hidden Password
- SZU 7
- Kubernetes1.2新特性分析(一)
- JavaScript中this详解
- welogic不能启动主服务器,出现 java.lang.NumberFormatException: null错误
- J2EE增删改查个人总结
- MapReduce和Tez对比
- leetcode 20. Valid Parentheses
- 检查C语言的内存问题 参考网址:http://blog.csdn.net/sduliulun/article/details/7732906
- .Net AOP(三)继承ContextBoundObject方式
- Hibernate与MyBatis的对比总结
- iOS中的关联对象
- 将一个图读入邻接表 将邻接表读入一个图
- 敏捷开发方法综述
- Maven生成可以直接运行的jar包的三种方式