zoukankan      html  css  js  c++  java
  • [BZOJ2440][中山市选2011]完全平方数

    题目描述

    小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而这丝毫不影响他对其他数的热爱。

    这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X。小X很开心地收下了。

    然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗?

    输入输出格式

    输入格式:

    包含多组测试数据。文件第一行有一个整数 TTT ,表示测试数据的组数。 第 222 至第 T+1T+1T+1 行每行有一个整数 KiK_iKi ,描述一组数据,含义如题目中所描述。

    输出格式:

    含T 行,分别对每组数据作出回答。第 iii 行输出相应的第 KiK_iKi 个不是完全平方数的正整数倍的数。

    输入输出样例

    输入样例#1: 
    4 
    1 
    13 
    100 
    1234567
    输出样例#1: 
    1 
    19 
    163 
    2030745

    说明

    对于 50%的数据有 1≤Ki≤1051 ≤ K_i ≤ 10^51Ki105 , 对于 100%的数据有 1≤Ki≤109,T≤501 ≤ K_i ≤ 10^9, T ≤ 501Ki109,T50


     

    伤心,从入坑就开始陪着我的U盘,在3个小时前于河北省图书馆遗失,我忍着万分的悲痛,写下了这篇题解。

    直接二分答案mid,把题目变成在1~mid中是否有k个数满足要求。

    然后我们就考虑怎么求有多少个数满足要求。

    我们回顾一下莫比乌斯函数的定义。

    ①若d=1,μ(d) = 1;

    ②若d=p1*p2*...*pk, pi均为不同的质数,那么μ(d)=(-1)^k;

    ③其他情况μ(d) = 0;

    题目所要求的没有平方因子就 代表着μ != 0。

    然后答案就是n - 只有2个质因子的数的平方的倍数的个数(1不算质因子) + 只有3个质因子的数的平方的倍数的个数 - 只有4个质因子的数的平方的倍数的个数.......

    为什么?举个例子:

    设 x1 = p1, x2 = p1 * p2;

    那么x1^2=p1^2, x2^2 = p1^2 * p2^2;

    我们发现,x2^2在x1^2的p2^2倍的时候被计算过了一次...

    根据容斥原理得出上列式子,然后我们如何计算呢?

    容易发现,式子前面的符号,恰好就是莫比乌斯函数,即乘积a前面的符号是μ(a);

    所以计算的式子为Σ(i:1~sqrt(mid)) (mid/i^2);

    做完了...

    还是放不下...我的课件我的截图我的表情我的模板我的照片全在里面QAQ。


    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    #define int long long
    bool vis[50005];
    int miu[50005], prime[50005], top;
    
    inline int calc(int mid)
    {
        int sum = 0;
        for (register int i = 1 ; i * i <= mid ; i ++)
            sum += miu[i] * mid / (i * i);
        //printf("%d
    ", sum);
        return sum;
    }
    
    signed main()
    {
        miu[1] = 1;
        for (register int i = 2 ; i < 50000 ; i ++)
        {
            if (!vis[i])
            {
                prime[++top] = i;
                miu[i] = -1;
            }
            for (register int j = 1 ; j <= top and i * prime[j] < 50000 ; j ++)
            {
                vis[i*prime[j]] = 1;
                if (i % prime[j]) miu[i*prime[j]] = - miu[i];
                else {
                    miu[i*prime[j]] = 0;
                    break;
                }
            }
        }
        
        int T;
        scanf("%lld", &T);
        while(T--)
        {
            int k;
            scanf("%lld", &k);
            int l = 1, r = k << 1;
            int ans = 0;
            while(l <= r)
            {
                int mid = l + r >> 1;
                if (calc(mid) >= k) r = mid - 1, ans = mid;
                else l = mid + 1;
            }
            printf("%lld
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    iOS_SN_地图的使用(3)
    iOS_SN_地图的使用(2)
    iOS_SN_百度地图基本使用(1)
    iOS_SN_CoreData(二)
    iOS_SN_CoreDate(一)封装使用
    iOS_SN_UITableView的优化
    阿里云 单表备份 恢复
    svn 彻底删除文件、文件夹
    @去除
    服务器安全保护
  • 原文地址:https://www.cnblogs.com/BriMon/p/9361563.html
Copyright © 2011-2022 走看看