题意:
求出[l,r]区间上所有数的完美度
完美度定义:
我们知道一个数字的完美度是 把这个数字分解成三个整数相乘A*A*B(0<A<=B)的方法数,例如数字80可以分解成1*1*80,2*2*20 ,4*4*5,所以80的完美度是3
题解:
这题看是范围很大,其实只要枚举A*A的值就可以解决了,总复杂度是O(n^(1/3))。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
void cmax(int& a,int b){ if(b>a)a=b; }
void cmin(int& a,int b){ if(b<a)a=b; }
void cmax(ll& a,ll b){ if(b>a)a=b; }
void cmin(ll& a,ll b){ if(b<a)a=b; }
void add(int& a,int b,int mod){ a=(a+b)%mod; }
void add(ll& a,ll b,ll mod){ a=(a+b)%mod; }
const int oo=0x3f3f3f3f;
const int MOD=1000000007;
const double eps = 1e-9;
const int maxn = 100005;
ll Count(ll n){
ll ans = n, t;
for(ll i = 2; i * i * i <= n; i++){
ans += n / (i * i) - i + 1;
}
return ans;
}
int main(){
ll a, b;
while(cin >> a >> b){
cout << Count(b) - Count(a - 1) << endl;
}
return 0;
}