首页 > 其他分享 >AtCoder备赛刷题 ABC 361 | x = a^b

AtCoder备赛刷题 ABC 361 | x = a^b

时间:2025-01-06 13:01:56浏览次数:3  
标签:AtCoder ABC int 备赛 pri mu 12 100 zs

学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:AtCoder 备赛刷题 | 汇总


【Problem Statement】

How many integers x x x between 1 1 1 and N N N, inclusive, can be expressed as x = a b x=a^b x=ab using some positive integer a a a and a positive integer b b b not less than 2 2 2?

有多少个介于 1 1 1 和 N N N 之间的整数 x x x(包括在内)可以用一些正整数 a a a 和一个不小于 2 2 2 的正整数 b b b 表示为 x = a b x=a^b x=ab?

【Constraints】

  • All input values are integers.
  • 1 ≤ N ≤ 1 0 18 1≤N≤10^{18} 1≤N≤1018

【Input】

The input is given from Standard Input in the following format:

N

【Output】

Print the answer as an integer.

【Sample Input 1】

99

【Sample Output 1】

12

The integers that satisfy the conditions in the problem statement are 1 , 4 , 8 , 9 , 16 , 25 , 27 , 32 , 36 , 49 , 64 , 81 1,4,8,9,16,25,27,32,36,49,64,81 1,4,8,9,16,25,27,32,36,49,64,81: there are 12 12 12.

【Sample Input 2】

1000000000000000000

【Sample Output 2】

1001003332

【代码详解】

《AtCoder x = a^b》 #数学# #枚举#

#include <bits/stdc++.h>
using namespace std;
#define int long long
int mu[100], pri[100], pre[100], cnt;
int n, ans;
bool zs[100];
void calc()
{
    zs[1] = true;
    mu[1] = 1;
    for (int i=2; i<100; i++)
    {
        if (!zs[i]) pri[cnt++] = i, mu[i] = -1;
        for (int j=0; pri[j]*i<100; j++)  // 线性筛模板
        {
            zs[i*pri[j]] = true;
            if (i%pri[j]) mu[i*pri[j]] = -mu[i];
            else 
            {
                mu[i*pri[j]]=0;
                break;
            }
        }
    }
}
int qmi(int a, int b)  // 快速幂模板
{
    int mul = 1;
    while (b) 
    {
        if (b&1) mul *= a;
        a = a * a;
        b >>= 1;
    }
    return mul;
}
int Sqrt(int n, int k)
{
    int l=1, r = pre[k];
    int ret = 1;
    while (l<r)  // 二分模板
    {
        int mid = (l+r+1)>>1;
        if (qmi(mid, k)<=n) l = mid;
        else r = mid-1;
    }
    return l;
}

signed main()
{
    calc();
    cin >> n;
    for (int i=2; i<=60; i++)
        if (mu[i]!=0)
            pre[i] = (int)pow(1ll<<61, 1.0/i);
    for (int i=2; i<=60; i++)
        if (mu[i]!=0)
            ans -= mu[i]*(Sqrt(n,i)-1);
    cout << ans+1;
    return 0;
}

【运行结果】

99
12

标签:AtCoder,ABC,int,备赛,pri,mu,12,100,zs
From: https://blog.csdn.net/guolianggsta/article/details/144886462

相关文章

  • AtCoder备赛刷题 ABC 361 | Go Territory
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】ThereareNNNston......
  • atcoder 杂题 #05
    atcoder杂题#05abc340_gLeafColorabc340_fF-S=1abc361_gGoTerritoryabc386_fOperateKabc340_g独立想出了这道题。如果我们确定了子图的叶子,那么这个子图就确定了。又由于叶子的颜色要相同,所以每种颜色的贡献是互相独立的。首先如果一种颜色有\(x\)个点,那......
  • ABC387F
    题目还是很不错的。我们对于每一个\(i\),直接对\(a_i\)向\(i\)连一条边,很容易发现这是一个基环树。那我们直接按照套路来,考虑一个环对答案的贡献,显然环如果合法,则所有颜色相同,直接把它看成一个点即可。缩点后那剩下的解释一棵树了,我们考虑dp,设\(dp_{u,j}\)表示以\(u\)......
  • 2025 AtCoder 周寄
    目录前言\(\text{\color{#0000FF}ABC387\color{black}perf\color{#00C0C0}1398}\)前言赛时总结展望前言2024拜拜了。回首整个2024的OI历程,自己一直在摆烂。8月份的暑假基本没碰过OI,10月底的CSP-J255pts遗憾2=,11月底的NOIP连T3暴力都没来得及打,年底五中请lx......
  • 题解:AT_abc203_e [ABC203E] White Pawn
    由于\(m\le2\times10^{5}\),所以可以把有黑格子的行扔到一个map里面,然后再用一个set存储当前能走到哪些格子。按照题意暴力转移,开两个vectorin和out,分别存储哪些格子要删掉,哪些格子要加入。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;int......
  • AtCoder Beginner Contest 387 赛后复盘
    省流:A,B,C,D,FA-B模拟即可。C数位dp。首先我们先将问题转换为\([1,R]\)中蛇数的个数减去\([1,L-1]\)中蛇数的个数。设\(num_i\)为数字的第\(i\)位(从左往右数)。我们设\(f_{dep,mx,lim,ze}\)表示当前第\(dep\)位,首位为\(mx\),有没有达到上限,有没有前导零。那么......
  • 全国职业院校技能大赛-大数据应用赛项-离线数据处理-备赛笔记04-2024省赛离线数据处理
    数据抽取:1、抽取ds_db01库中customer_inf的增量数据进入Hive的ods库中表customer_inf。根据ods.user_info表中modified_time作为增量字段,只将新增的数据抽入,字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前日期的前一天日期(分区字段格式为yyyy......
  • AtCoder Regular Contest 065
    \(AT\_arc065\_a\)https://www.luogu.com.cn/problem/solution/AT_arc065_a题解:在读到\(d\)或\(e\)时判断是不是\(dream,dreamer,erase,eraser\)即可。注意\(dreamer\)和\(erase,eraser\)有重叠,于是在\(d\)时要特判,具体见代码。#include<bits/stdc++.h>usingnamespacestd......
  • 关于此题[ABC382E] Expansion Packs 概率DP的一些总结
    传送门首先看到这道题,我们发现想要求收集K个卡牌的期望开包数,必须要先求出每个包开出0~n张卡各自的概率,于是预示着这道题将要进行两次概率DP。首先我们求每个包开出0~n张卡各自的概率。这个很好求,我们假设f[i][j]表示前\(i\)张卡中开出\(j\)张卡的概率,那么显然有:\(f[i][j]=p[......
  • 题解:AtCoder [ARC176D] Swap Permutation
    题意原题链接给定一个长度为\(n\)的排列\(p\),并执行以下操作\(m\)次:选择\(1\leqi<j\leqn\),交换\(p_i\)和\(p_j\)。定义一个序列\(p\)的权值为\(\sum_{i=1}^{n-1}|p_i-p_{i-1}|\)。求在\(\binom{n}{2}^m\)种可能的操作后,\(p\)的价值之和。答案对\(998244353\)......