先处理一下题目要求的式子,即
AB(Ak,Bk)=AB(A,B)k
。那么分割规模为
ab
的矩形时,所得的硬币总值就为
∑k|(a,b)ab(a,b)k=ab(a,b)σ((a,b))
,其中
σ
表示因子和。
设
f(n)
表示题目要求的结果,那么就有
f(n)=f(n−1)+∑0<i≤nin(i,n)σ(i,n)
,直接转移时间复杂度
O(n)
,不太可行。但是
n
的因子最多只有
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned int uint;
uint dp[500010];
ll phi[500010],rho[500010];
bool bd[500010];
void _gen(){
int i,j,k;ll a,b;clr(bd);
for(i=1;i<=500000;++i)
phi[i]=rho[i]=1;
for(i=2;i<=500000;++i){
if(bd[i])continue;
for(j=i;j<=500000;j+=i){
bd[j]=1;
for(k=j/i,a=i,b=1;!(k%i);k/=i,a*=i,b*=i);
rho[j]*=((a*i-1)/(i-1));
phi[j]*=(a-b);
}
bd[i]=0;
}
};
ll _cl(int n){
int i,j,d=sqrt(n);ll r=0;
for(i=1;i<=d;++i){
if(n%i)continue;
if(i*i==n){
r+=(((ll)i*phi[i]/2)*rho[i]);
}
else{
r+=(((ll)(n/i)*phi[n/i]/2)*rho[i]);
if(i==1)
r+=rho[n/i];
else
r+=(((ll)i*phi[i]/2)*rho[n/i]);
}
}
return r*(ll)n;
};
void _gendp(){
int i;dp[1]=1;
for(i=2;i<=500000;++i)
dp[i]=dp[i-1]+(uint)_cl(i);
};
int ct=0;
void cl(){
int n;cin>>n;
cout<<"Case #"<<++ct<<": "<<dp[n]<<endl;
};
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
ios::sync_with_stdio(0);
_gen();_gendp();
int t;cin>>t;
while(t--)cl();
return 0;
};