题目链接:http://lightoj.com/volume_showproblem.php?problem=1236

题意很好懂,就是让你求lcm(i , j)的i与j的对数。

可以先预处理1e7以内的素数,然后用来筛选出能被n整除的所有的素数以及素数的个数,时间复杂度是小于根号的。然后用DFS或者BFS选出所有的约数(不会很大)。

现在要是直接2个for利用gcd筛选lcm(x,y)==n的个数的话肯定超时,所以这里把每个素数看作一个位,比如:2 3 5这3个素因子,那我2可以看作2进制上的第一位(1),3第二位(10)...那一个约数就可以表示素因子相乘 也可以表示成一个二进制数 比如6表示成(11),那么要是两个约数的二进制数的'|'值等于n,那么lcm就等于n。然后处理出每个约数对应的二进制数。注意一点的是约数里的某个素因子不满其最大个数的话 就表示为0。

 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <vector>
 #include <algorithm>
 #include <queue>
 using namespace std;
 typedef long long LL;
 typedef pair <LL , int> P;
 ;
 vector <P> G;
 vector <LL> res;
 bool prime[MAXN];
 ];

 void init() {
     prime[] = true;
     ;
      ; i < MAXN ; i++) {
         if(!prime[i]) {
             p[++cont] = i;
              ; j < MAXN ; j += i) {
                 prime[j] = true;
             }
         }
     }
 }
 /*
 DFS
 void dfs(int dep , int end , LL num) {
     if(dep == end) {
         res.push_back(num);
         return ;
     }
     LL temp = (1 << (dep));
     for(int i = 0 ; i < G[dep].second ; i++) {
         dfs(dep + 1 , end , num);
     }
     dfs(dep + 1 , end , num + temp);
 }
 */
 void bfs(int end) {
     queue <P> que;
     while(!que.empty()) {
         que.pop();
     }
     que.push(P( , ));
     while(!que.empty()) {
         P temp = que.front();
         que.pop();
         if(temp.second == end) {
             res.push_back(temp.first);
         }
         else {
              ; i <= G[temp.second].second ; i++) {
                 if(i == G[temp.second].second) {
                     que.push(P(temp.first + ( << temp.second) , temp.second + ));
                 }
                 else {
                     que.push(P(temp.first , temp.second + ));
                 }
             }
         }
     }
 }

 int main()
 {
     init();
     int t;
     LL n;
     scanf("%d" , &t);
      ; ca <= t ; ca++) {
         scanf("%lld" , &n);
         printf("Case %d: " , ca);
         ) {
             printf("1\n");
             continue;
         }
         res.clear();
         G.clear();
          ; (LL)p[i]*(LL)p[i] <= n ; i++) {
             ) {
                 ;
                 ) {
                     n /= p[i];
                     cont++;
                 }
                 G.push_back(P((LL)p[i] , cont));
             }
         }
         )
             G.push_back(P(n , ));
          << G.size()) -  , cont = ;
         //dfs(0 , G.size() , 0);
         bfs(G.size());
          ; i < res.size() ; i++) {
              ; j < res.size() ; j++) {
                 if((res[i] | res[j]) == ans) {
                     cont++;
                 }
             }
         }
         printf( + );
     }
 }

Light oj 1236 - Pairs Forming LCM (约数的状压思想)的更多相关文章

  1. light oj 1236 - Pairs Forming LCM &amp; uva 12546 - LCM Pair Sum

    第一题给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,……em, 则结果为((1+2*e1)*(1+2*e2)……(1+2*em)+1)/2. 代码如下: #include <st ...

  2. LightOJ 1236 Pairs Forming LCM (LCM 唯一分解定理 + 素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1236 Pairs Forming LCM Time Limit:2000MS     Memor ...

  3. LightOJ 1236 - Pairs Forming LCM(素因子分解)

    B - Pairs Forming LCM Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  4. LightOj 1236 - Pairs Forming LCM (分解素因子,LCM )

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1236 题意:给你一个数n,求有多少对(i,  j)满足 LCM(i, j) = n, ...

  5. LightOJ - 1236 - Pairs Forming LCM(唯一分解定理)

    链接: https://vjudge.net/problem/LightOJ-1236 题意: Find the result of the following code: long long pai ...

  6. 1236 - Pairs Forming LCM -- LightOj1236 (LCM)

    http://lightoj.com/volume_showproblem.php?problem=1236 题目大意: 给你一个数n,让你求1到n之间的数(a,b && a<= ...

  7. LightOJ 1236 Pairs Forming LCM 合数分解

    题意:求所有小于等于n的,x,y&&lcm(x,y)==n的个数 分析:因为n是最小公倍数,所以x,y都是n的因子,而且满足这样的因子必须保证互质,由于n=1e14,所以最多大概在2^ ...

  8. LightOj 1236 Pairs Forming LCM (素数筛选&amp;&amp;唯一分解定理)

    题目大意: 有一个数n,满足lcm(i,j)==n并且i<=j时,(i,j)有多少种情况? 解题思路: n可以表示为:n=p1^x1*p2^x1.....pk^xk. 假设lcm(a,b) == ...

  9. LightOJ 1236 Pairs Forming LCM【整数分解】

    题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1236 题意: 找与n公倍数为n的个数. 分析: ...

随机推荐

  1. bzoj3743: [Coci2015]Kamp

    首先树dp求出一个点的答案 然后再一遍dfs换根(是叫做换根吗.. 详见代码 #include <iostream> #include <cstdio> #include &l ...

  2. 【转】IOS高级教程1:处理1000张图片的内存优化

    转载请保留以下原文链接: http://my.oschina.net/taptale/blog/91894 一.项目需求 在实际项目中,用户在上传图片时,有时会一次性上传大量的图片.在上传图片前,我们 ...

  3. 三步搞定ISO/GHO安装系统 - imsoft.cnblogs

    高清互动安装系统附件:重装系统视频教程.7z

  4. Linux系统文件访问控制列表

    linux系统中的RWX权限.特殊权限.隐藏权限都是对某一类用户设置的, 而如果希望对某个指定的用户进行单独的权限设置的话就需要用到文件的 访问控制权限了. 我们可以对普通文件或目录进行设置ACL,通 ...

  5. HDU-2368 Alfredo&#39;s Pizza Restaurant

    http://acm.hdu.edu.cn/status.php Alfredo's Pizza Restaurant Time Limit: 1000/1000 MS (Java/Others)   ...

  6. 关于C#与.NET Framework

    前几天,有一个做测试的问我.NET Framework是什么,和C#是什么关系呢. 下面我就来解释一下.NET Framework是什么:.NET Framework是一个框架,是应用程序运行时所需要 ...

  7. 随手小记(es6)

    在学习前辈阮一峰大神写的<ECMAScript入门>一书的过程中,第九章中讲到对象扩展时,第一条我就有点看不懂 ES6允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. v ...

  8. jQuery事件控制点击内容下拉

    1.设计实例 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  9. python 读取大文件,按照字节读取

    def read_bigFile(): f = open("123.dat",'r') cont = f.read() : print(cont) cont = f.read() ...

  10. Xshell登录Docker

    使用SSH协议登录即可,用户名为docker,密码为tcuser