Bzoj 1833
coc youyl
posted @ 2015年6月27日 20:15
in bzoj
, 802 阅读
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1833
题目分类:乱搞
题意:
球在a-b的整数中每一个数码的出现次数
题解:
强行每一位推出1-9的出现次数,减出0出现的次数。
程序:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long d1[20][10];
long long n,m;
inline long long exp(long long x,long long y)
{
long long ans=1;
while (y!=0)
{
if(y&1)
{
y--;
ans=(ans*x);
}
else
{
y/=2;
x=x*x;
}
}return ans;
}
inline long long getdigit(long long x)
{
long long ans=1;
for (int i=1;i<=12;i++)
{
if(x>=exp(10,i))
{
ans+=exp(10,i-1)*9LL*i;
// printf("%d %d\n",i,ans);
}
else
{
ans+=(x-exp(10,i-1)+1)*i;
// printf("%d %d\n",i,ans);
break;
}
}
return ans;
}
long long s1[10],s2[10];
long long va[10];
inline void solve1(long long x)
{
s1[0]=getdigit(x);
if(x==0)
{
s1[0]=1;
return;
}
int tp=0;
while (x!=0)
{
tp++;
va[tp]=x%10;
// printf("%d %I64d\n",tp,va[tp]);
x/=10;
}
// printf("%d %I64d %I64d\n",tp,va[1],va[2]);
long long val=0;
if(va[1]!=0)s1[va[1]]++;
for (int i=1;i<=tp;i++)
{
val+=va[i]*exp(10,i-1);
if(i!=tp&&va[i+1]!=0)s1[va[i+1]]+=(val+1);
for (int j=1;j<=9;j++)
{
s1[j]+=va[i]*d1[i-1][j];
}
for (int j=1;j<va[i];j++)
{
s1[j]+=exp(10,i-1);
}
}
for (int i=1;i<=9;i++)s1[0]-=s1[i];
}
inline void solve2(long long x)
{
s2[0]=getdigit(x);//printf("%d\n",s2[0]);
memset(va,0,sizeof(va));
if(x==0)
{
s2[0]=1;
return;
}
int tp=0;
while (x!=0)
{
tp++;
va[tp]=x%10;
// printf("%d %I64d\n",tp,va[tp]);
x/=10;
}
// printf("%d %I64d %I64d\n",tp,va[1],va[2]);
long long val=0;
if(va[1]!=0)s2[va[1]]++;
for (int i=1;i<=tp;i++)
{
val+=va[i]*exp(10,i-1);//printf("%d\n",val);
if(i!=tp&&va[i+1]!=0)s2[va[i+1]]+=(val+1);
for (int j=1;j<=9;j++)
{
s2[j]+=va[i]*d1[i-1][j];
}
for (int j=1;j<va[i];j++)
{
s2[j]+=exp(10,i-1);
}//printf("%d:",i);
// for (int j=1;j<=9;j++)
// {
// printf("%d ",s2[j]);
// }printf("\n");
}
for (int i=1;i<=9;i++)s2[0]-=s2[i];
// printf("%d\n",s2[0]);
}
int main()
{
scanf("%lld %lld",&n,&m);
for (int i=0;i<=9;i++)
{
d1[1][i]=1;
}
for (int i=2;i<=12;i++)
{
for (int j=0;j<=9;j++)
{
d1[i][j]=d1[i-1][j]*10LL+exp(10,i-1);//printf("%d %d %I64d\n",i,j,d1[i][j]);
}
}
solve1(n-1);
solve2(m);
for (int i=0;i<=9;i++)
{
printf("%lld",s2[i]-s1[i]);
if(i!=9)printf(" ");
}
return 0;
}
2023年4月23日 20:47
crediblebh