ABC F,一直 WA 11,下大分。求调/kel。
#include <bits/stdc++.h>
#define int long long
#define il inline
#define pii pair<int,int>
using namespace std;
int T,n;
il long double qp(int x,int y)
{
long double res=1;
for(;y;y>>=1,x=x*x)
if(y&1)res=res*x;
return res;
}
il long double check(int st,int x)
{
int cnt=0;
long double cur=0;
while(st)
{
if(st%2==1)cur+=qp(x,cnt);
st/=2;cnt++;
}
return cur;
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>T;
while(T--)
{
cin>>n;int ans=0;
for(int b=2;b<=1000;++b)
{
int tmp=n,ok=1;
while(tmp)
{
if(tmp%b>1)ok=0;
tmp/=b;
}
if(ok)ans++;
}
for(int i=0;i<=(1<<7);++i)
{
int l=1,r=1e18+1;
while(l<r)
{
int mid=(l+r)>>1;
if(check(i,mid)>=n)r=mid;
else l=mid+1;
}
if((abs(check(i,l)-n)<1e-6)&&(l>1000))ans++;
}
cout<<ans<<endl;
}
return 0;
}
具体的思路是分类讨论 b≤1000 和 b>1000,前者直接枚举,后者二分。实现比较劣。