列表

详情


MMT3. 怪数

描述

M突然对怪数产生了兴趣。假设一个数n,如果[n/1]+[n/2]+...+[n/k](k为趋近于正无穷的正整数)为一个偶数,那么这个数是一个怪数,现在给定一个区间[a,b],求[a,b]之间有多少怪数。

[x]表示不大于x的最大整数。

输入描述

输入只包含一行,有两个非负整数a,b(0<=a,b<=2^31,a<=b)。

输出描述

输出区间[a,b]中的怪数的个数。

示例1

输入:

0 10

输出:

6

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-05-20

#include<stdio.h>
#include<math.h>
int main(){
    long long int a,b,i=1,j=1,k,n=0,suma=0,sumb=0;
    scanf("%lld%lld",&a,&b);
    while (suma<a+1){
        suma+=i;i+=2;
    }
    i-=2;
    while (sumb<b+1){
        sumb+=j;j+=2;
    }
    j-=2;
    for (k=i;k<=j;k+=2){
        if (k%4==1){
            if (k==i)
                n=n+suma-a;
            else if (k!=i && k==j)
                n=n+b+j-sumb+1;
            else if(k!=i && k!=j)
                n+=k;
        }
    }
    printf("%lld",n);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-05-20

#include<stdio.h>
#include<math.h>
int main(){
    long long int a,b,i=1,j=1,k,n=0,suma=0,sumb=0;
    scanf("%lld%lld",&a,&b);
    while (suma<a+1){
        suma+=i;i+=2;
    }
    i-=2;
    while (sumb<b+1){
        sumb+=j;j+=2;
    }
    j-=2;
    for (k=i;k<=j;k+=2){
        if (k%4==1){
            if (k==i)
                n=n+suma-a;
            else if (k!=i && k==j)
                n=n+b+j-sumb+1;
            else if(k!=i && k!=j)
                n+=k;
        }
    }
    printf("%lld",n);
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 380KB, 提交时间: 2020-10-31

#include<stdio.h>
#include<math.h>
int main(){
    long long int a,b,i=1,j=1,k,n=0,suma=0,sumb=0;
    scanf("%lld%lld",&a,&b);
    while (suma<a+1){
        suma+=i;i+=2;
    }
    i-=2;
    while (sumb<b+1){
        sumb+=j;j+=2;
    }
    j-=2;
    for (k=i;k<=j;k+=2){
        if (k%4==1){
            if (k==i)
                n=n+suma-a;
            else if (k!=i && k==j)
                n=n+b+j-sumb+1;
            else if(k!=i && k!=j)
                n+=k;
        }
    }
    printf("%lld",n);
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 404KB, 提交时间: 2021-07-03

#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
ll F(ll x){
    if(x<0)
        return 0;
    else if(x==0)
        return 1;
    ll s=0, v = sqrt(x);
    if(v%2){
        s = v*(v+1)/2;
    }else{
        ll t = v-1;
        s = t*(t+1)/2;
        s += x-v*v+1;
    }
    return s;
}
 
int main(){
    ll a, b;
    cin>>a>>b;
    cout<<F(b)-F(a-1)<<endl;
 
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 448KB, 提交时间: 2021-09-14

#include <bits/stdc++.h>
using namespace std;

int main(){
    unsigned int a,b;
    cin >> a >> b;
    int num = 0;
    int i = 0;
    while(pow(i,2) < a)
    {
        i++;
    }
    while(pow(i,2) <= b)
    {
        if((i-1)%2 == 0)
        {
            num += pow(i,2) - a;
            a = pow(i,2);
            i++;
        }
        else
        {
            a = pow(i,2);
            i++;
        }
    }
    if((i-1) % 2 == 0)
        num += b - a + 1;
    cout << num;
    return 0;
}

上一题