不幸的程序猿
先来看看题目
1001:不幸的程序猿
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
程序猿是一种近几十年来出现的新物种,是工业革命的产物。英文(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非常悲剧的存在。
最新的研究显示,程序猿有一大特点:易猝死。因为程序猿们常常改变自身的生物钟,给身体带来了不幸。为了长命百岁,程序猿们多保重身体,不要老是加班,熬到深夜!
最近,又传来了一个噩耗,某程序员不幸劳累去世,留下了下面的代码:
事后调查发现,该程序猿是因为日夜等待上段代码的运行结果,而……你接替了他的工作,聪明的你知道:“如果不找到另一种方法达到上段代码的功能,我也会……”。于是,你决定,重新写一段代码,能输出和这段代码一样的结果。
输入
输入第一行是一个正整数 rep(值不超过100),其含义参见上述代码;对于每一组测试数据,仅包含一个正整数 n(值不超过1,000,000,009),其含义参见上述代码。
输出
对于每一组测试数据,输出 sum 的值,其含义参见上述代码。
样例输入
3
1
2
3
样例输出
1
3
6
提示
直接复制并提交上述代码,会返回超时。
emmmm,很简单的一道题,发现了规律后一行代码就可以搞定
分析贴出的代码可知,题目中要求计算出从1到输入的数字n之间所有数的f(i)之和,所以关键就在于我们对f()函数的理解了
f()函数返回该数字每一位上的数字之和,如果累加得到的和超过10,则再求该和的各个数位之和,直至小于10为止,听上去很复杂,,,一开始做就陷入了这个坑久久不能自拔
稍加分析就会发现:该函数输出的数字肯定是在1-9之间,然后进一步发现规律,所有的数字经过该函数得到的数字呈规律变化123456789123456789123456789123…,所以只需要数出来有多少个循环,简单除一下再加上余数几位的和,就得到了答案
需要注意的是结果要求mod10000
最后附上AC代码:
#include <bits/stdc++.h>
#define fur(i,a,b) for(int i=(a);i<(b);i++)
#define furr(i,a,b) for(int i=(a);i>(b);i--)
#define max(a,b) ( ((a)>(b)) ? (a):(b) )
#define min(a,b) ( ((a)>(b)) ? (b):(a) )
#define cl(a, b) memset((a),1,sizeof(a))
#define Point int
#define null NULL
#define OFFSET 500000
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
const int N=1010;
const ll mod=10000;
using namespace std;
int main()
{
int rep;
scanf("%d",&rep);
while(rep--)
{
ll n;
scanf("%I64d",&n);
int res = (((n/9)*45)%mod + (n%9+1)*(n%9)/2)%mod;
printf("%d\n",res);
}
return 0;
}
最后感谢某位不知道愿不愿意透漏姓名的大佬指点走出旋涡…