zoukankan      html  css  js  c++  java
  • Uva12716 素数筛思想的应用

    Uva12716

    题意:

    输入整数n,1<= n <=3e7,问有多少个整数对(a,b)满足:1 <= b <= a <= n,且gcd(a,b)== a XOR b

    解法:

    a^b = c 等价于a^c = b  所以枚举a和c,而a和c全部枚举肯定TLE,所以高效算法:通过c是a的约数这个关系来枚举会减小循环,必须要将c放在循环外面,因为c的情况比较少。其实本题就是要求:c=a-b(规律),c=a^b   

     1 /*
     2   打表找规律
     3 */
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<cstring>
     7 using namespace std;
     8 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }
     9 const int maxn = 3e7 + 5;
    10 int ans[maxn];
    11 
    12 void generate() {
    13     //类似于筛素数,我们的外层是公约数(素数)
    14     //注意筛素数的时候我们先筛小的,也就是最基本的那个,这样子就可以筛掉所有最基本的那个的倍数
    15     for (int c = 1; c <= maxn / 2; c++) {
    16         for (int a = c + c; a <= maxn; a += c) {
    17             int b = a - c;
    18             if ((a^b) == c) ans[a]++;
    19         }
    20     }
    21     for (int i = 2; i < maxn; i++)ans[i] += ans[i - 1];
    22 }
    23 
    24 int main() {
    25     int T; scanf("%d", &T);
    26     int kase = 0;
    27     generate();
    28     while (T--) {
    29         int n; scanf("%lld", &n);
    30         printf("Case %d: %d
    ", ++kase, ans[n]);
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    for 循环/ while 循环/ do-while 循环
    让元素脱离动画流
    缓存布局信息
    一个程序员的管理心得
    CenOS下Tomcat外网不能访问
    卸载CentOS自带的JDK并配置指定JDK环境变量
    Linux系统安装Mysql
    系统的非功能性需求
    做软件的追求
    路途小歇
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9491206.html
Copyright © 2011-2022 走看看