lightoj 1089

很有意思的题目,1到n的所有数的约数的合。

sqrt(n)一次算两两边的。

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <cmath>
    #include <stack>
    #include <cstdlib>
    #include <queue>
    #include <map>
    #include <iostream>
    #include <algorithm>
    #include <bits/stdc++.h>

    using namespace std;
    typedef long long LL;
    LL cal(LL x)
    {
        LL ans=0;
        for (LL i=2;i<=sqrt(x);i++)
        {
            ans+=(x/i-1)*i;
            LL zuo=x/(i+1),you=x/(i);
            if (you!=i)
            {
                ans+=(zuo+1+you)*(you-zuo)/2*(i-1);
            }
        }
        return ans;
    }

    //long long getAns(long long m)
    //{
    //    long long ans = 0;
    //    for(long long i = 2;i<=sqrt(m);i++)
    //    {
    //
    ////前sqrt(n)个约数
    //        ans += (m/i-1)*i;
    //
    ////约数个数为前sqrt(n)
    //        long long j = m/i;
    //        long long q = (m/(i+1));
    //        if(j!=i)
    //        {
    //            ans += (j+q+1)*(j-q)/2*(i-1);
    //        }
    //    }
    //    return ans;
    //}

    int main()
    {
        int T,ncas=1;
        LL x;
        scanf ("%d",&T);
        while (T--)
        {
            scanf ("%lld",&x);
            printf ("Case %d: %lld\n",ncas++,cal(x));
        }
        return 0;
    }
时间: 2024-10-14 05:35:29

lightoj 1089的相关文章

LightOJ 1089 - Points in Segments (II) 线段树区间修改+离散化

http://www.lightoj.com/volume_showproblem.php?problem=1089 题意:给出许多区间,查询某个点所在的区间个数 思路:线段树,由于给出的是区间,查询的是点,考虑将其离线并离散化,普通线段树即可. /** @Date : 2016-12-17-20.49 * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : */ #include<bi

LightOJ 1030 Discovering Gold【概率】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1030 题意:基础概率题. 代码: #include <stdio.h> #include <string.h> #include <vector> #include <string> #include <algorithm> #include <iostream> #include <iterator>

LightOJ - 1370 Bi-shoe and Phi-shoe

题目链接:http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1370 题目大意:给N个数a[i], N <= 1e6,问使 Φ(x) >= a[i] 成立的最小x的所有x的和是多少. 解题思路:我们知道的是对于素数 m 来说,phi[m] = m - 1.另一方面,对于一个合数 m 来说, phi[m] < phi[x] , x > m && x 是素数. 因此,我们可以认为,每

lightoj 1057 - Collecting Gold(状压dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其实就是最大的x轴或y轴的差.然后只有15个藏金点状压一下加dfs就行了. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define inf 0X3f3f3f

Lightoj 1088 - Points in Segments 【二分】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1088 题意: 有一维的n个点和q条线段.询问每条线段上的点有多少个: 思路:寻找这些点中对于每条线段的上下界即可. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include

Lightoj 1090 - Trailing Zeroes (II)

题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1090 题目大意: 给出n,r,p,q四个数字1<=n,r,p,q<=1000000,求出的末尾有几个0? 解题思路: 是不是一下子懵了,数字好大,复杂度好高,精度怎么办···············,就问你怕不怕? 因为你是Acmer,这都不应该是问题.因为10的因子只有2和5,所以可以打表保存从1到当前数字相乘的积中分别含有2,5的个数.然后算出中分别含有2,5的个数,

暑期训练狂刷系列——Lightoj 1084 - Winter bfs

题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1084 题目大意: 有n个点在一条以零为起点的坐标轴上,每个点最多可以移动k,问最终能不能把所有点都聚集在大于等于三个点的集合里面,如果能最少需要几个这样的集合? 解题思路: 刚开始看到题目感觉好简单,就开始了sort然后贪心之旅,这就是错误的开始.最后发现这样并不行,然后再Alex的提醒下想用单调队列优化,在我愚昧的理解下竟然写成了bfs,提交竟然ac了,surprise~

九度OJ 1089 数字反转

题目1089:数字反转 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2591 解决:1425 题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. 只有n行,每行两个正整数a和b(0<a,b<=10000). 输出: 如果满足题目的要求输出a+b的值,否则输出NO. 样例输入: 2 12 34 99 1 样例输出: 46 NO #in

LightOJ - 1148 - Mad Counting

先上题目: 1148 - Mad Counting   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 32 MB Mob was hijacked by the mayor of the Town "TruthTown". Mayor wants Mob to count the total population of the town. Now the naive approach to