2193 So Hard
题意:
化简小数。
思路:
最多不超过9位,那么乘以10^9就好了。
然后注意的就是加一下精度。
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#define ll __int64
#define eps 1e-11
using namespace std;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
cin>>t;
while(t--)
{
double x;
scanf("%lf",&x);
ll fz=(ll)((x+eps)*1000000000);
ll fm=1000000000;
ll tep=gcd(fz,fm);
printf("%I64d/%I64d\n",fz/tep,fm/tep);
}
return 0;
}
2191 完美的数字
题意:
[a,b]区间内每个数的完美度的和。
所谓完美度就是X能够分解成多少个A*A*B(0<A<=B)的个数。
思路:
对于[1,x]区间内。
我们枚举A。
因为A<=B 对于每个i,所以若要成立,最小的数是i*i*i
然而我们只要判断i*i*i<=x 的范围内,包含多少个i*i。
对于每个i*i-i+1。
然后相减一下。
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#define ll __int64
#define eps 1e-11
using namespace std;
int main()
{
ll x,y;
while(scanf("%I64d%I64d",&x,&y)!=-1)
{
ll ansx=0,ansy=0;
x--;
for(ll i=1;i*i*i<=x;i++) ansx+=x/(i*i)-i+1;
for(ll i=1;i*i*i<=y;i++) ansy+=y/(i*i)-i+1;
printf("%I64d\n",ansy-ansx);
}
return 0;
}