题目地址:cf#219_div2_B
一个很奇怪的数列求和,项数有可能特别多,但是很多相邻的都是一样的,我们一起加上去,这样就不会超时
wa了很多次因为精度,首先取出多少位数就不要用log(k)/log(10); 太容易误差了,用while() 保险。
代码:
#include<iostream>
#include<cmath>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long inta;
inta mypow(inta a,int n)
{
inta ans=1;
for(int i=0;i<n;i++)
{
ans*=a;
}
return ans;
}
int main()
{
inta w,m,k;
cin>>w>>m>>k;
inta all=w/k;
inta ans=0;
// int a=floor(log(m)/log(10));
int a=0;
while(mypow(10,a)<=m)
{
a++;
}
a--;
inta b=mypow(10, a+1);;
if(all<=(b-m)*(a+1))
{
//cout<<"jingqi"<<endl;
ans=all/(a+1);
}
else
{
ans=b-m;
inta cur=(b-m)*(a+1);
int t=0;
// cout<<ans<<endl;
while(cur<all)
{
//cout<<cur<<endl;
if(all-cur<9LL*b*mypow(10,t)*(a+2+t))
{
ans+=(all-cur)/(a+2+t);
break;
}
else
{
ans+=9LL*b*mypow(10,t);
cur+=9LL*b*mypow(10,t)*(a+2+t);
//cout<<t<<endl;
t++;
}
}
}
cout<<ans<<endl;
}