程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> BZOJ2440(完全平方數)二分+莫比烏斯容斥

BZOJ2440(完全平方數)二分+莫比烏斯容斥

編輯:C++入門知識

題意:完全平方數是指含有平方數因子的數。求第ki個非完全平方數。


解法:比較明顯的二分,getsum(int middle)求1-middle有多少個非完全平方數,然後二分。求1-middle的非完全平方數個數可以用總數減掉完全平方數個數。計算完全平方數的個數用容斥:

首先加上n/(2*2)+n/(3*3)+n/(5*5)+n/(7*7)...+...然後減掉出現兩次的,然後加上三次的...奇加偶減。這就是mou的原型,用mou數組計算很簡單;

\

代碼:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef unsigned long long LL;
const int Max=100010;
const LL INF=2e16+7;

LL mou[Max];
void init()
{
    for(LL i=2; i>t;
    while(t--)
    {
        scanf("%d",&k);
        LL left=1,right=INF;
        while(left<=right)
        {
            int middle=(left+right)/2;
            if(getnum(middle)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved