• 洛谷U32670 小凯的数字(比赛)


    题目网址

    https://www.luogu.org/problemnew/show/U32670

    题目背景

    NOIP2018 原创模拟题T1

    NOIP DAY1 T1 or DAY 2 T1 难度

    是否发现与NOIP2017 DAY1 T1 有异曲同工之妙

    题目描述

    小凯有一天突发奇想,写下了一串数字:l(l+1)(l+2)...(r-1)rl(l+1)(l+2)...(r1)r

    例如:l=2,r=5时,数字为:23452345

    l=8,r=12时数字为:8910111289101112

    小凯很喜欢数字9,所以他想问你他写下的数字除以9的余数是多少

    例如:l=2,r=5时,2345 mod 9 = 5

    输入输出格式

    输入格式:

    第一行为数字Q,表示小凯有Q个问题

    第2-Q+1行,每行两个数字 l,r 表示数字范围

    输出格式:

    对于每行的问题输出一行,一个数字,表示小凯问题的回答

    输入输出样例

    输入样例#1:
    2
    2 5
    8 12
    输出样例#1:
    5
    5

    输入样例#2:
    3
    1 999
    123 456
    13579 24680
    输出样例#2:
    0
    6
    0

    说明

    样例1解释:2345 mod 9 = 5   89101112 mod 9 = 5

    30% 数据满足:Q<=10;l,r<=100

    50% 数据满足:Q<=100;l,r<=10000

    70% 数据满足:Q<=1000;l,r<=10^6

    100%数据满足:Q<=10000;l,0<r<=10^12且 l<=r

    题解

    根据本题的数据范围,不难发现一定是一道数论题。这一题的难度和NOIP提高组day1的第一题水平差不多,所以应该不是很难;

    解决本题,首先要知道:

    定理1、能被9整除的数各位数字之和能被9整除;

    定理2、如果有9*n(n为自然数)个连续的数字(如题意,比如123456789),那么该数一定能被9整除

    第一点很好理解,其实第二点也同样如此,根据高斯求和公式,(首项+末项)*项数/2

    有计算经验的同学一定知道,(首项+末项)和项数中一定有一个是2的倍数,所以不存在带余除法,

    那么因为项数是9的倍数,所以上述公式(首项+末项)*项数/2,一定是9的倍数,所以定理2成立。

    那么,根据这两个定理,本题代码就很好写了。

    再整理一遍思路:

    1.读入问题数量Q,循环Q次,每次读入l和r;

    2.计算出数字个数(即r-l+1的值),并对9取余,即定义一个变量cnt=(r-l+1)%9;

    3.从r开始,往前依次枚举cnt次(因为cnt对9取过模,所以最多循环9次)

       将枚举出的数字对9取余,加入sum中;

    4.输出sum对9取余即可

    5.本题还有一个细节:要用long long

    代码

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <iostream>
     6 #include <algorithm>
     7 #define ll long long
     8 
     9 using namespace std;
    10 
    11 int Q;
    12 ll l,r;
    13 
    14 void work()
    15 {
    16     scanf ("%d",&Q);
    17     while (Q--)
    18     {
    19         scanf ("%lld%lld",&l,&r);
    20         ll cnt=(r-l+1)%9;
    21         ll sum=0;
    22         for (ll i=1,k=r;i<=cnt;i++,k--)
    23             sum+=k%9;
    24         printf ("%lld
    ",sum%9);
    25     }
    26     return;
    27 }
    28 
    29 int main()
    30 {
    31     work();
    32     return 0;
    33 }

    出处:https://www.cnblogs.com/yujustin/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    温馨提示:尽量使用版本较高的浏览器,并打开极速模式。
  • 相关阅读:
    静态全局变量
    java处理相对路劲
    Java 获取字符串中第N次出现的字符位置
    java 更改list 某一元素?
    for循环,如何结束多层for循环
    SQL Server Management Studio的对象资源管理器的使用
    线程
    存储过程,稍微复杂
    触发器--里面涉及触发器调存储过程
    Bootstrap:弹出框和提示框效果以及代码展示
  • 原文地址:https://www.cnblogs.com/yujustin/p/9733696.html
Copyright © 2020-2023  润新知