UVa 10162 Last Digit (数学规律)

本文探讨了一种计算特定数列求和的周期性模式,并通过分析数列的性质,简化了求模10的操作。利用数列的循环规律和周期性特性,提出了一种简化计算方法,特别是对于求和后的结果对10取模,从而在实际应用中节省了大量的计算资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1103


1. 先看单个数的规律:

0^n%10: 0

1^n%10: 1

2^n%10: 2,4,8,6

3^n%10: 3,9,7,1

4^n%10: 4,6

5^n%10: 5

6^n%10: 6

7^n%10: 7,9,3,1

8^n%10: 8,4,2,6

9^n%10: 9,1

2. 因为最大循环长度为4,所以我们可以看到,i^i%10和i^(i+20)%10是相同的,也就是说,i^i%10的周期是20

而(1^1+……+20^20)%10=4,

所以(1^1+……+40^40)%10=8,

(1^1+……+60^60)%10=2,

(1^1+……+80^80)%10=6,

(1^1+……+100^100)%10=0,

这么看来,S(N)%10=S(N%100)%10

所以考虑N的后两位即可。

3. 为了简化运算,还可以进一步分析:

不妨算一算(1^1+……+10^10)%10=7,所以(11^11+……+20^20)%10=7(上面得出的4-7+10=7),所以每十个数的和模10余7

那么我们算出S(1)~S(10)的个位及[S(11)-S(10)]~[S(20)-S(10)]的个位a[i]后,

记b=N%100,则ans=(b/10*7+a[b%20])%10


完整代码:

/*0.015s*/

#include<bits/stdc++.h>
using namespace std;
const int a[20] = {0, 1, 5, 2, 8, 3, 9, 2, 8, 7, 0, 1, 7, 0, 6, 1, 7, 4, 8, 7}; ///S(N)%10,0<=N<=19

char s[105];

int main()
{
	int len, b, c;
	while (gets(s), s[0] != '0')
	{
		len = strlen(s);
		if (len == 1) b = s[0] & 15;
		else b = atoi(s + len - 2);
		printf("%d\n", (b / 10 * 7 + a[b % 20]) % 10);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值