首页 > 其他分享 >选博士 题解

选博士 题解

时间:2023-08-30 09:48:10浏览次数:47  
标签:10 博士 int 题解 sum long while 这道题

FZQOJ
Luogu

前言

​ 节假日在家 闲来无事 ,那就 写一篇题解吧。

题目描述

​ 前面一大堆废话,总结来说就是:

​ 求 l -- R 区间的和

​ 但是每一个数转换为 它本身所有数位的和,重复这个操作, 直到这个数 ⩽ 9

思路

​ 我不知道各位神犇们是怎么做的,所以在此分享一下我的思路


前缀和(70pts)

这道题乍一眼看,不是前缀和吗!那么,可以写个函数:

int change(int x){
	while(x >= 10){
		int sum = 0;
		while(x)
			sum += x % 10, x /= 10;
		x = sum;
	}
	return x;
}

接着用前缀和记录每一个数就可以了,


But, 但是这道题的数据范围:
​ 1 ⩽ l ⩽ r ⩽ 260


数组直接爆炸,光荣RE


找规律(100pts)

从题目给的样例:

​ A9 = 9, A10 = 1, A11 = 2, A12 = 3 ... A18 = 9, A19 = 1...

不难看出:

​ 这不就是小学学的周期问题吗?每十个数为一个周期。

那么我们就不需要将每一个数通过函数算一遍了,只要算出第一个数的函数值,

通过周期一直推到 R 就可以了


But, 但是这道题还是拿不了满分,于是我们可以再优化一下:

将两数之间的数字 9,可以直接求出有几个周期,并计算和

再加上它的余下的数就行。


最后

处理一下题目的一点细节,那么代码如下(不留坑了吧):

请在理解题目思路后,先自行编写

#include<bits/stdc++.h>
using namespace std;

long long a, b, n;
/*不开long long 会爆*/

long long change(long long x){
    /*change函数,用于计算第一位*/
	while(x >= 10){
		long long sum = 0;
		while(x) sum += x % 10, x /= 10;
		x = sum;
	}
	return x;
}

int main(){
	scanf("%lld", &n);
	for(int i = 1; i <= n; i++){
		scanf("%lld %lld", &a, &b);
		long long t = change(a), ans = 0, xn;
		for(int j = t; j <= 9 && a <= b; j++) 
			ans += j, a++;
        /*方便计算周期*/
		xn = b - a;
		if(xn >= 0){
			ans += xn / 9 * 45;
            /*计算周期间的和*/
			for(int j = 1; j <= xn % 9 + 1; j++){
				ans += j;
			}
            /*加上剩下的数*/
		}
		printf("%lld\n", ans);
	}
	return 0;
}

那么,这道题就光荣AC

咳, 点赞,懂?

标签:10,博士,int,题解,sum,long,while,这道题
From: https://www.cnblogs.com/koukilee/p/17666414.html

相关文章

  • 「USACO3.2」Magic Squarest题解
    「USACO3.2」MagicSquarest题解建议优先阅读题目后再看题解:FZQOJluogu-题目大意给定初始二维数组(也即是题中所说的魔板):12348765并提供以下3种操作:\(A\).交换上下两行;\(B\).将最右边的一行移动到最左边;\(C\).顺时针旋转魔板的中央4个数字询问最少多少次......
  • [USACO05DEC] Layout G 题解
    fzqojluogu题意分别给出\(ml\)和\(md\)对,关于n头奶牛位置的关系,求1号到n号奶牛的最大距离是多少每一对ml的关系转化成不等式就是:\(A-B\leC\)相应的,每一对md的关系转化成不等式就是:\(A-B\geqC\)(\(A\),\(B\)是两头奶牛的位置,\(C\)是他们相差的距离)思路看到多元的......
  • CF1864D Matrix Cascade 题解
    首先把式子拆一下,可以知道\(x-i\ge|y-j|\)等价于\(x-y\gei-j\)和\(x+y\gei+j\),注意到每次操作\((i,j)\),影响到的点\((x,y)\)均要满足\(x>i\),那么我们每次就必须要按照从上往下的顺序进行,否则上面的点无法影响到,即从第一行开始操作。又注意到对于\((i,j)\)如果执......
  • CF1864B Swap and Reverse 题解
    注意到交换操作,无法改变下标的奇偶性,因此只能通过考虑翻转操作改变。注意到如果\(i\)是奇数,那么要令\(i+k-1\)为偶数的话\(k\)必须为偶数,若\(i\)是偶数,要令\(i+k-1\)是奇数的话,\(k\)也应为偶数,而\(k\)为奇数的情况翻转了也无法改变奇偶性。因此通过\(k\)的奇偶性......
  • CF1839C Insert Zero and Invert Prefix 题解
    首先考虑无解的情况,很明显\(a_n\)必须为\(0\),否则没有解,因为如果最后一位为\(1\)那么必须有\(n\)这个数存在于\(b\)序列中,而这种情况时不符合题意的。然后考虑如何求解,先考虑一种比较特殊的情况,就是若干个\(1\)后面接着一个\(0\),这里假设\(1\)的数量有\(k\)个,这......
  • P9437 『XYGOI round1』一棵树 题解
    首先这是一道很明显的换根dp。首先注意到要拼接数,所以我们可以先处理出\(num_i=10^{x}\),使得\(10^x>a_i>10^{x-1}\),这样方便我们后面算贡献。我们以这棵树为例子来推状态转移方程。先假设\(dp_u\)表示以\(1\)为根时,从\(u\)的子树的点到\(u\)的权值和。那么\[......
  • CF1862E Kolya and Movie Theatre 题解
    先注意到我们娱乐值损耗的多少只与最后一场电影有关系,所以假设最后一场电影看的下标为\(k\),那么最后就要减去\(d\timesk\)。得出这个性质之后开个小根堆反悔贪心即可,首先\(a_i<0\)的没必要考虑,对于\(a_i>0\)的,如果还没到\(m\)场电影,我们就直接往里塞就可以,如果到了,我们......
  • P8675 [蓝桥杯 2018 国 B] 搭积木 题解
    总述此题用区间dp解决,二维前缀和优化。朴素做法阶段:自上而下数每一层。状态:\(dp_{i,l,r}\)表示自上而下数第\(i\)行中在\([l,r]\)摆积木的方案数。状态转移方程:根据题意可知,若要在\([l,r]\)中摆积木,那么\([l,r]\)中不允许有\(\tt{X}\),而第\(i\)层的\([l,r]\)......
  • P7809 [JRKSJ R2] 01 序列 题解
    对于第二种操作,很容易想到只有\(1\)或\(2\)两种答案,若该区间内存在\(01\)这个子序列,那么答案为\(2\)反之为\(1\).可以通过对该\(01\)串做一个前缀和,若出现\(01\)这个子序列就累加,最后判断左右端点是否相等即可,时间复杂度\(O(n)\).对于第一种操作,\(\text{Subtest1}......
  • CF1833D Flipper 题解
    赛场上思路出来了但是代码没调出来。首先考虑右端点,很明显,要让操作后的序列字典序尽量地大,那么就要使操作后的序列第一个数尽量地大,考虑\(n\)或\(n-1\),如果\(n\)在原序列的第一个位置,那么此时无论怎么调整都无法使得它在新序列的第一个位置,此时就要考虑让\(n-1\)在新序列......