当前位置: 代码迷 >> 综合 >> 找规律 hdu1163 Eddy's digital Roots
  详细解决方案

找规律 hdu1163 Eddy's digital Roots

热度:39   发布时间:2023-12-14 04:09:34.0

一看到题,刚开始会感觉很难想,但是可以先从10以内的数开始找规律

比如我们先看到7,设pre(n)表示把n里面的数字累加起来直到n<10

pre(7^7)=pre(823543)=pre(25)=7


因为太大,我们会想,能不能结合快速幂的思想呢

7^7=7^3 * 7^3 * 7

然后这时,我们会发现

pre(7^7)=pre(pre(7^3)*pre(7^3)*7)


再找一个11试试,又发现

pre(11^11)=pre(pre(11^5)*pre(11^5)*11)

pre(11^5)=pre(pre(11^2)*pre(11^2)*11)

再次试我们又能找打一个逆天规律

如果有n=a+b

那么pre(s^n)=pre(pre(s^a)*pre(s^b))


所以这题就可以用类似快速幂的方法解决了

#include<cstdio>
#include<map>
#include<set>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cctype>
#include<vector>
#include<functional>
#include<algorithm>using namespace std;
typedef long long LL;
typedef pair<int, int> PII;const int MX = 10000 + 5;
const int INF = 0x3f3f3f3f;int F[MX];int pre(int w) {int ret = 0;while(w) {ret += w % 10;w /= 10;}if(ret > 9) return pre(ret);return ret;
}int solve(int a, int b) {if(b == 1) return pre(a);int ret = solve(a, b / 2);ret *= ret;if(b & 1) ret *= a;return pre(ret);
}int main() {int n;for(int i = 1; i < MX; i++) {F[i] = solve(i, i);}while(~scanf("%d", &n), n) {printf("%d\n", F[n]);}return 0;
}