• 小凯的数字


    题目概述

    题目描述

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

    例如:(l=2,r=5)时,数字为:(2345)

    (l=8,r=12)时,数字为:(89101112)

    小凯很喜欢数字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 quad mod quad 9 = 5 quad \\ 89101112 quad mod quad 9 = 5)

    数据范围

    30% 数据满足:(Q le 10;l,r le 100)
    50% 数据满足:(Q le 100;l,r le {10}^4)
    70% 数据满足:(Q le 1000;l,r le {10}^6)
    100%数据满足:(Q le 10^4;0<l,r le 10^{12})(l le r)


    解题报告

    题意理解

    自己看题吧,我懒了

    算法解析

    首先你得有小学数论知识.

    [a equiv 0 mod 9 Rightarrow a的数字和是9的倍数 ]

    也就是说,(a)(9)的倍数,就必须数字和是(9)的倍数.

    然后,我们来康康,一些连续的数字的规律.

    [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ]

    他们数字和模(9)是多少呢?

    [0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4 ]

    假如我问你,([1,13]),他们构成的数字,模(9)是多少

    [12345678910111213 ]

    然后等量代换

    [1+2+3+4+5+6+7+8+9+10+11+12+13 ]

    或者说

    [1+2+3+4+5+6+7+8+0+1+2+3+4 ]

    其实还可以是

    [1+2+3+4 ]

    最后就是

    [10 equiv 1 mod 9 ]

    因此我们可以得出.

    我们容易发现,对于任意的九个连续自然数,记为

    [a_1,a_2,a_3 dots a_9 ]

    这九个数字的每一位数字之和必被九整除。

    证明一下.

    [a_1 数字和为x \\x+(x+1)+dots (x+9) equiv 9 imes x+(1+2+3+dots9) equiv 45 mod 9 equiv 0 mod 9 ]

    然后这道题,就可以愉快的结束了.

    [len=r-l+1 quad len为区间[l,r]长度 \\len=9 imes a+b \\因此我们只需要求出b长度个数的模9余数即可 ]


    代码解析

    #include <bits/stdc++.h>
    using namespace std;
    long long ans,T,l,r,w,x,len;
    inline void work()
    {
    	ans=0;
    	len=r-l+1,w=len%9;//剩下的长度
    	l=r-w+1;//截取剩下
    	while(l<=r)
    	{
    		x=l;
    		while (x)//数字分解
    		{
    			ans+=(x%10);
    			x/=10;
    		}
    		ans%=9;
    		l++;
    	}
    	ans%=9;
    	cout<<ans<<endl;
    }
    inline void init()
    {
    	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    	cin>>T;
    	while (T--)
    	{
    		cin>>l>>r;
    		work();
    	}
    }
    int main()
    {
    	init();
    	return 0;
    }
    
  • 相关阅读:
    【IoT】IDEA 编译出错 Error running xxx : Command line is too long.Shorten command line
    【可视化】地震剖面道数据可视化绘制思路
    【IoT】使用MQTTBox.exe发送消息到Thingsboard3.3.3上
    【IoT】thingsboard3.3.3测试,使用nodemqtt发送消息
    【IoT】thingsboard3.3.3编译问题解决
    【Postgres】Postgres12帮助手册
    【IoT】发布启动thingsboard3.3.3
    【前端开发】Webpack mars3dvue2electron打包问题
    【可视化】地震数据体Segy文件inline、xline道数据计算获取
    【IoT】thingsboard3.3.3运行启动
  • 原文地址:https://www.cnblogs.com/gzh-red/p/11823096.html
Copyright © 2020-2023  润新知