题目描述
Bob 得到了 Alice 的礼物后十分开心,研究了更多数字。Bob 觉得一个数字 x 是优美的,当且仅当存在一个正整数 a 和一个 > 1 的正整数 b,使得 x = a^b。
Bob 没事的时候就喜欢数这些优美的数字,然而 Bob 的计算能力有限,如果数字太大就算不出来了。现在他想让你帮他算出 1 到 N 中有多少个数是优美的。
输入输出格式
输入格式:
一行一个正整数 N,如题面所述。
输出格式:
一行一个整数 ans,表示 11 到 N 中优美的数的个数。
输入输出样例
说明
1010 以内的优美得数有 1, 4, 8, 9。
对于 30% 的数据满足 1 ≤ N ≤ 105。
对于 70% 的数据满足 1 ≤ N ≤ 1010。
对于 100% 的数据满足 1 ≤ N ≤ 1018。
100分做法:
1. 对于每个有贡献的 x ,我们考虑如何用唯一的形式表示它,方式有很多种。
2. 对于一个有贡献的 x ,我们用所有 x = a Λ b 中使得 b 最大的一种形式来表示它来表示它。
3. 定义函数 g(b)表示有多少 x 能被表示为 a Λ b。函数 f (b)表示有多少 x 能被表示为 a Λ b ,且 b 满足上述性质。
4. 显然 f 函数的和即为答案。
5. g 函数的求法:pow(n , 1 / b)。
6. f 函数的求法:g(b)-Σ b | i f (i)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll n,f[70],ans; 5 int main() 6 { 7 scanf("%lld",&n); 8 for(int i=60;i>=2;--i) 9 { 10 f[i]=(ll)pow(n,1.0/i)-1; 11 for(int j=i+i;j<=60;j+=i) 12 f[i]-=f[j]; 13 ans+=f[i]; 14 } 15 printf("%lld",ans+1); 16 return 0; 17 }