DIV2 1000pt

题意:给定两个集合A和B,A = {b1*q1i | 0 <= i <= n1-1},B = {b2*q2i | 0 <= i <= n2-1},问将AB两个集合合并之后的集合中元素的个数。(注意,每个集合中每个元素只能有一个)。其中0 <= b1,b2,q1,q2 <= 5*10^8,1 <= n1,n2 <= 10^5。

解法:首先,我们称b = 0或者q = 0或者q = 1的集合为特殊集合,因为特殊集合中最多有两个元素。若至少有一个集合为特殊集合,则此问题容易解决。下面考虑两个集合都不为特殊集合的情况。

   其实,如果不是A和B中的数太大,我们可以将他们每个都求出来,然后放到一个set<long long>里面,返回set.size()即可,时间复杂度O(n1 + n2)。我们需要找到一种表示这些大数的方法。考虑整数的唯一分解式。

   每个整数可以表示成(a1^p1) * (a2^p2) * (a3^p3) *..* (ak^pk)的形式,也就是说,我们只需要统一所有会用到的质数,然后把p1,p2..pk放到一个vector里面,就可以表示每个整数。然后用一个set<vector<long long> >即可统计元素的个数。

tag: math, set

  1. // BEGIN CUT HERE
  2. /*
  3. * Author: plum rain
  4. * score :
  5. */
  6. /*
  7.  
  8. */
  9. // END CUT HERE
  10. #line 11 "GeometricProgressions.cpp"
  11. #include <sstream>
  12. #include <stdexcept>
  13. #include <functional>
  14. #include <iomanip>
  15. #include <numeric>
  16. #include <fstream>
  17. #include <cctype>
  18. #include <iostream>
  19. #include <cstdio>
  20. #include <vector>
  21. #include <cstring>
  22. #include <cmath>
  23. #include <algorithm>
  24. #include <cstdlib>
  25. #include <set>
  26. #include <queue>
  27. #include <bitset>
  28. #include <list>
  29. #include <string>
  30. #include <utility>
  31. #include <map>
  32. #include <ctime>
  33. #include <stack>
  34.  
  35. using namespace std;
  36.  
  37. #define CLR(x) memset(x, 0, sizeof(x))
  38. #define PB push_back
  39. #define SZ(v) ((int)(v).size())
  40. #define zero(x) (((x)>0?(x):-(x))<eps)
  41. #define out(x) cout<<#x<<":"<<(x)<<endl
  42. #define tst(a) cout<<#a<<endl
  43. #define CINBEQUICKER std::ios::sync_with_stdio(false)
  44.  
  45. typedef vector<int> VI;
  46. typedef vector<string> VS;
  47. typedef vector<double> VD;
  48. typedef long long int64;
  49.  
  50. const double eps = 1e-;
  51. const double PI = atan(1.0)*;
  52. const int maxint = ;
  53. const int N = ;
  54. const int M = ;
  55.  
  56. int an[][N];
  57. int tmp_sz;
  58. int64 bn[][N];
  59.  
  60. int inte_dev(int x, int* an, int64* bn)
  61. {
  62. int all = -;
  63. for (int i = ; i*i <= x;){
  64. if (!(x%i)){
  65. an[++all] = i;
  66. bn[all] = ;
  67. }
  68. while (!(x%i)){
  69. ++ bn[all];
  70. x /= i;
  71. }
  72. if (i == ) ++ i;
  73. else i += ;
  74. }
  75. ++ all;
  76. if (x != ){
  77. an[all] = x;
  78. bn[all++] = ;
  79. }
  80. return all;
  81. }
  82.  
  83. int gao(int64 x, int a)
  84. {
  85. int ret = ;
  86. while (!(x % a)){
  87. x /= a;
  88. ++ ret;
  89. }
  90. return ret;
  91. }
  92.  
  93. VI vadd(VI a, VI b)
  94. {
  95. VI ret; ret.clear();
  96. for (int i = ; i < tmp_sz; ++ i)
  97. ret.PB (a[i]+b[i]);
  98. return ret;
  99. }
  100.  
  101. class GeometricProgressions
  102. {
  103. public:
  104. int count(int aa, int b, int n, int c, int d, int m){
  105. int64 a[];
  106. a[] = aa; a[] = b; a[] = c; a[] = d;
  107. if (!a[] || !a[] || a[] == ){
  108. swap (a[], a[]); swap (a[], a[]); swap (n, m);
  109. }
  110. if (!a[] || !a[] || a[] == ){
  111. set<int64> tmp;
  112. tmp.insert(a[]);
  113. if (n > ) tmp.insert(a[]*a[]);
  114.  
  115. int cnt = , sz_tmp = tmp.size();
  116. int64 now = a[];
  117. for (int i = ; i < m; ++ i){
  118. if (tmp.count(now)) ++ cnt;
  119. else tmp.insert(now);
  120. now *= a[];
  121. if (now > 25e16)
  122. return m + sz_tmp - cnt;
  123. }
  124. return tmp.size();
  125. }
  126.  
  127. int64 all[];
  128. for (int i = ; i < ; ++ i)
  129. all[i] = inte_dev(a[i], an[i], bn[i]);
  130.  
  131. set<int> tmp;
  132. VI tt; tt.clear();
  133. for (int i = ; i < ; ++ i)
  134. for (int j = ; j < all[i]; ++ j)
  135. if (!tmp.count(an[i][j])){
  136. tmp.insert (an[i][j]);
  137. tt.PB (an[i][j]);
  138. }
  139.  
  140. vector<int> v[];
  141. for (int i = ; i < ; ++ i)
  142. v[i].clear();
  143. tmp_sz = tmp.size();
  144. for (int i = ; i < ; ++ i)
  145. for (int j = ; j < tmp_sz; ++ j)
  146. v[i].PB (gao(a[i], tt[j]));
  147.  
  148. set<VI > ans;
  149. ans.erase(ans.begin(), ans.end());
  150. VI now = v[];
  151. for (int i = ; i < n; ++ i){
  152. if (!ans.count(now)) ans.insert(now);
  153. now = vadd(now, v[]);
  154. }
  155. now = v[];
  156. for (int i = ; i < m; ++ i){
  157. if (!ans.count(now)) ans.insert(now);
  158. now = vadd(now, v[]);
  159. }
  160. return ans.size();
  161. }
  162.  
  163. // BEGIN CUT HERE
  164. public:
  165. //void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }
  166. void run_test(int Case) { if ((Case == -) || (Case == )) test_case_0();}
  167. private:
  168. template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
  169. void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
  170. void test_case_0() { int Arg0 = ; int Arg1 = ; int Arg2 = ; int Arg3 = ; int Arg4 = ; int Arg5 = ; int Arg6 = ; verify_case(, Arg6, count(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)); }
  171. void test_case_1() { int Arg0 = ; int Arg1 = ; int Arg2 = ; int Arg3 = ; int Arg4 = ; int Arg5 = ; int Arg6 = ; verify_case(, Arg6, count(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)); }
  172. void test_case_2() { int Arg0 = ; int Arg1 = ; int Arg2 = ; int Arg3 = ; int Arg4 = ; int Arg5 = ; int Arg6 = ; verify_case(, Arg6, count(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)); }
  173. void test_case_3() { int Arg0 = ; int Arg1 = ; int Arg2 = ; int Arg3 = ; int Arg4 = ; int Arg5 = ; int Arg6 = ; verify_case(, Arg6, count(Arg0, Arg1, Arg2, Arg3, Arg4, Arg5)); }
  174.  
  175. // END CUT HERE
  176.  
  177. };
  178.  
  179. // BEGIN CUT HERE
  180. int main()
  181. {
  182. // freopen( "a.out" , "w" , stdout );
  183. GeometricProgressions ___test;
  184. ___test.run_test(-);
  185. return ;
  186. }
  187. // END CUT HERE

SRM 500(2-1000pt)的更多相关文章

  1. topcoder srm 500 div1

    problem1 link 如果decisions的大小为0,那么每一轮都是$N$个人.答案为0. 否则,如果答案不为0,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...

  2. TC250专场

    SRM 623 DIV2 1000pt 题意:给出一个最多50*50的矩阵,每个单元可能为'.'.'P'.'A','.'代表空地,你每次操作可以把一个P或者A拿到空地上,求一个最大的含有相同字符的矩形 ...

  3. SRM149 - SRM150(少SRM150-DIV1-LV3)

    SRM 149 DIV2 1000pt 题意: 对于n个人,第i人有pi的钱.将他们分成不超过四个组,每组统一交费x,对每个人,若他拥有的钱超过x则交费,否则不交费.问最多能使这些人交多少钱. 1&l ...

  4. Topcoder 好题推荐

    SRM SRM147 DIV1 1000pt DP SRM148 DIV1 1100pt 递归 SRM149 DIV1 1000pt math SRM150 DIV1 500pt DP SRM469 ...

  5. SRM 618 DIV1 500

    非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A   dp[n-1] A...A...A sgma(dp[j]*dp[ ...

  6. SRM 615 DIV1 500

    TC 都615了...时间过的真快啊. 第一次做出500分,心情还是很激动的,虽然看了很久的题解,TC官网上的题解,很详细,但是英语的...我搜了搜,发现一份日语的...好吧,我还是看看英语的吧... ...

  7. topcoder srm 628 div2 250 500

    做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: #i ...

  8. SRM 719 Div 1 250 500

    250: 题目大意: 在一个N行无限大的网格图里,每经过一个格子都要付出一定的代价.同一行的每个格子代价相同. 给出起点和终点,求从起点到终点的付出的最少代价. 思路: 最优方案肯定是从起点沿竖直方向 ...

  9. TopCoder SRM 639 Div.2 500 AliceGameEasy

    题意: 一个游戏有n轮,有A和B比赛,谁在第 i 轮得胜,就获得 i 分,给出x,y,问A得x分,B得y分有没有可能,如果有,输出A最少赢的盘数 解题思路: 首先判断n(n+1)/2 = (x+y)是 ...

随机推荐

  1. DataTable和List集合互转

    /// <summary> /// 将集合转换成DataTable /// </summary> /// <param name="list"> ...

  2. 虚拟机VHD格式解析到NTFS文件系统解析

    本来的需求是XEN下的镜像取证,但这篇仅包括他支持的一种格式,就是VHD,此项目从头开始大概用了两周时间,中间遇到了很多让人头大的问题,光是思考的笔记就写了十几页纸,不过实际上并没有那么难,主要是很久 ...

  3. hibernate映射关系之多对多

    多对多: * 关系在第三张表中,和两张表本身没有关系 * 多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面 来体现 * 关系体现: 第三张表的维护:增加.删除 course类对 ...

  4. ibatis集成Sqlite:小数据库也有大作用

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 Ibatis简介: Ibatis是一个类似于Hibernate的数据库ORM(对象关系映射,通俗点就是将数据 ...

  5. js登录页面的 回车事件

    js登录页面的 回车事件 js登录页面的 回车事件(2012-12-26 10:37:03)转载▼标签: jseventkey回车事件登录 分类: js.jquery  //回车事件 第一种docum ...

  6. 每个Linux新手都应该记住的10个基本Linux命令

    Linux对我们的生活有着很大的影响.至少,你的安卓手机上面就有Linux内核.然而,头一次入手Linux只会让你觉得不适.因为在Linux上,你通常应该使用终端命令,而不是只要点击启动器图像(就像你 ...

  7. css杂项,清除浮动

    在写HTML代码的时候,发现在Firefox等符合W3C标准的浏览器中,如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有clear,导致不能被撑开.看 ...

  8. Git error- fatal- Needed a single revision

    最近在开发中由于项目结构的重构,有一部分代码被抽出来作为了公共库(git submodule),这样公共库可以独立维护,同时其他库调用它也是非常方便的,避免了到处复制代码的痛苦. 但我在项目重构后第一 ...

  9. iOS · 安装RVM cocoaPods 及问题解决

    一.安装RVM 1.RVM:ruby版本管理器,命令行工具 管理Ruby 开始安装吧~ 对!!就是这样换成taobao ⬇️ $ gem sources -l $ gem sources --remo ...

  10. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...