给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。
2017-06-18 13:00
531 查看
题解:以1为例 枚举1-1,10-19,100-199,....每次从右界开始求出商k,根据公式求出此点左边最近的一点使得商为k+1,若d=1,则左边点不存在k+1,ans可以加上k*d的距离,然后跳过这段距离。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
const int mx = 1e5+10;
int n,m,len,mid;
ll cnt[11];
char str[15];
ll get_sum(int l,int r,int x){
ll ans = 0;
r = min(r,x);
int k = x/r,mod = x%r;
while(1){
int d = (r-mod)/(k+1);
if(d*(k+1)<r-mod) d++;
if(r-d<l) break;
ans += k*d;
mod = (k*d+mod)%(r-d);
r = r - d;
k = d==1? x/r:k+1;
}
ans+=(r-l+1)*k;
return ans;
}
void work(int x,int v){
for(int i=1;i<10;i++){
int rode = 1;
while(1ll*i*rode<=x){
int rr = i*rode+rode-1;
cnt[i] += v*get_sum(i*rode,rr,x);
rode*=10;
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(cnt,0,sizeof(cnt));
work(m,1);
work(n-1,-1);
for(int i=1;i<10;i++)
printf("%lld\n",cnt[i]);
}
return 0;
}
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
const int mx = 1e5+10;
int n,m,len,mid;
ll cnt[11];
char str[15];
ll get_sum(int l,int r,int x){
ll ans = 0;
r = min(r,x);
int k = x/r,mod = x%r;
while(1){
int d = (r-mod)/(k+1);
if(d*(k+1)<r-mod) d++;
if(r-d<l) break;
ans += k*d;
mod = (k*d+mod)%(r-d);
r = r - d;
k = d==1? x/r:k+1;
}
ans+=(r-l+1)*k;
return ans;
}
void work(int x,int v){
for(int i=1;i<10;i++){
int rode = 1;
while(1ll*i*rode<=x){
int rr = i*rode+rode-1;
cnt[i] += v*get_sum(i*rode,rr,x);
rode*=10;
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(cnt,0,sizeof(cnt));
work(m,1);
work(n-1,-1);
for(int i=1;i<10;i++)
printf("%lld\n",cnt[i]);
}
return 0;
}
相关文章推荐
- 随机生成N个1至100的整数,N由用户给定,程序输出出现次数最多的整数及其出现次数。如果有多个并列最多,需要输出全部最多的整数。
- 给定整数数组,除了一个元素之外,每个元素都出现三次。 找到那个只出现一次的数
- 【BZOJ 1833】【数位DP】 ZJOI2010 count【求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次】
- 一个文本文件中约有10万多行的数据,每个数据占一行(数据为一个整数)。要求:统计出总行数,并找出出现次数最多的那个整数。
- 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
- 给定整数数组,除了一个元素之外,每个元素都会出现两次。 找到那个只出现一次的
- 任意给定一整数数组,求两个元素之差的最大值和数组中出现次数最多的数
- 给定一个十进制正整数N,求出从1开始,到N的所有整数,数字1出现的次数(java实现)
- BZOJ 1833: [ZJOI2010]count 数字计数(在[a,b]中的所有整数中,每个数码(digit)各出现了多少次)
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 计算1~n之间的所有十进制整数中1的出现次数
- 一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。
- 给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数
- 把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出
- 统计[0,N)的所有整数中1出现的次数
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 给定一个正整数N,从1到N所有整数,计算出现1的个数
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。