NOI春测T2求调
  • 板块题目总版
  • 楼主奋斗祎号
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/5 21:49
  • 上次更新2023/10/23 22:54:24
查看原帖
NOI春测T2求调
471968
奋斗祎号楼主2023/3/5 21:49

代码如下:

#include <bits/stdc++.h>
using namespace std;
map<int,bool> mp;

// input & output for __int128 which is larger than long long
#define int __int128
inline void read(int &n){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    n=x*f;
}
inline void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n % 10 + '0');
}

int sqrt(int m)
{
    int l = 0,r = m, re;
    while (l <= r)
    {
        int mid = (l+r) / 2;
        if (mid*mid > m)
        {
            r = mid - 1;
        }
        else 
        {
            l = mid + 1;
            re = mid;
        }
    }
    // print(re);
    return re;
}

int D[1000005] = {0};

int luopow(int a,int b)
{
    int re = 1;
    int ta = a;
    if (D[ta] == 0)
    {           
        while(b) 
        {
            if(b&1)
            {
                re *= a;
            }
            a *= a;
            b >>= 1;
        }
        D[ta] = re;
    } else 
    {
        D[ta] = D[ta] * ta;
        re = D[ta];
    }
    return re;
}

signed main() 
{
    int n,k;
    int ans = 0;    
    read(n);
    read(k);
    int rk = k;
    if(n >= 1) {
        mp[1] = 1;
        ans++;
    }
    if (k==1)
    {
        ans += (n - 1);
    }
    else 
    {
        if (k == 2) {
                ans += (sqrt(n) - 1);
                k++;
            }
        while(k <= 100 && luopow(2,k) <= n)
        {
            int i = 2;
            if (mp[D[2]] == 0) 
            {
                mp[D[2]] = 1;
                ans++;
            }
            while(D[i] <= n)
            {
                int j = D[i];
                if (!mp[j] && rk > 2)
                {
                    ans++;
                    mp[j] = 1;
                }
                i++; 
                luopow(i,k);
            } 
            k++;
        }
    }
    print(ans);

    return 0;
}
#undef int

4096的3次方无法计数增加ans,求问各位大佬是什么原因呢?

2023/3/5 21:49
加载中...