3 1 3 100
Case #1: 1 Case #2: 30 Case #3: 15662489HintIn the second test case, there are six levels(1x1,1x2,1x3,2x2,2x3,3x3) Here is the details for this game: 1x1: 1(K=1); 1x2: 2(K=1); 1x3: 3(K=1); 2x2: 2(K=1), 4(K=2); 2x3: 6(K=1); 3x3: 3(K=1), 9(K=3); 1+2+3+2+4+6+3+9=30
题意:给你个n,让你求在n的范围内。是否能将一个矩形分成若干个同样大小为k的正方形,相应有val值,让你统计在n内的全部可能的分数总值
思路:首先我们来试着求解∑i=1nn?igcd(nk,ik),那么我们能够确定的是假设能够把n?m的矩形分成大小为k的正方形的话,那么k一定是gcd(n,
i)的因子。那么对于一项来说由于公式能够变形
n?i?kgcd(n,i)
-> n?(ic1+ic2+...)
{k枚举全部的可能},那么cj是n的因子,那么icj就是因子相应的系数,我们再从全部的i来讲。对于因子我们能够计算出全部可能的数,比方因子cj,我们能够得到cj,
2?cj,
3?cj,
4?cj....n,那么相应的系数就是我们须要的icj,累加起来计算是:
num[cj]=(1+2+...+ncj)=(1+ncj)?(ncj)2
val[n]=∑i=1nnum[i]
ans[n]=ans[n?1]+val[n]
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define ll __int64 using namespace std; const int maxn = 500005; const ll mod = 1ll<<32; ll num[maxn], dp[maxn]; void cal() { for (ll i = 1; i < maxn; i++) for (ll j = i; j < maxn; j += i) num[j] += (j/i+1) * (j/i) / 2; } void init() { memset(num, 0, sizeof(num)); cal(); dp[1] = 1; for (ll i = 2; i < maxn; i++) { dp[i] = dp[i-1] + num[i]*i; dp[i] = dp[i] % mod; } } int main() { init(); int t, n, cas = 1; scanf("%d", &t); while (t--) { scanf("%d", &n); printf("Case #%d: %I64d\n", cas++, dp[n]); } return 0; }
原文:http://www.cnblogs.com/mengfanrong/p/5184759.html