题目链接:传送门
题意:给w,m,k,d(n)表示n这个数是几位数,w为总量,k为单个花费
从m开始如果的d(m)*k的花费小于w,则w减去这些花费,新的序列加入m
然后m+1,m+2…直到总量用完,求出序列的数的个数
做法就是求出m离10^(d(m))的花费能不能用完,能用完直接更新len,m更新到10^(d(m)),然后继续。
这题被套了,就是在判断花费的时候的乘法会爆longlong,所以判断里面要变成除法
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10010
int d(long long int n){
int len=0;
while(n){
n/=10;
len++;
}
return len;
}
long long int Pow(int a,int b){
long long int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b/=2;
}
return r;
}
int main(){
long long int w,m;
int k;
cin>>w>>m>>k;
int x=d(m);
long long int len=0;
while(w){
long long int y=Pow(10,x)-m;
if(y<=(w/k)/x){
w-=(long long)y*k*x;
len+=y;
m=Pow(10,x);
x=d(m);
}
else{
len+=(w/k)/x;
w=0;
}
}
cout<<len<<endl;
return 0;
}