f(3) = 3^2 = 9,
f(25) = 2^2 + 5^2 = 4 + 25 = 29,
f(442) = 4^2 + 4^2 + 2^2 = 16 + 16 + 4 = 36
0 < n < 10^20について, f(n)が平方数となるようなnの和の末尾9桁を求めよ.
個数を記録する漸化式と合計を記録する漸化式の2重で楽勝です。
#include<stdio.h>
#include<string.h>
#include<iostream>
__int64 dp[21][81*21+1],dp2[21][81*21+1];
const int MOD=100000*10000;
int main(){
memset(dp,0,sizeof(dp));
memset(dp2,0,sizeof(dp2));
dp[0][0]=1;
__int64 m=1;
for(int i=1;i<=20;i++){
for(int j=0;j<=9;j++){
for(int k=j*j;k<=81*20;k++){
dp[i][k]=(dp[i][k]+dp[i-1][k-j*j])%MOD;
dp2[i][k]=(dp2[i][k]+dp[i-1][k-j*j]*m*j+dp2[i-1][k-j*j])%MOD;
}
}
m=(m*10)%MOD;
}
__int64 ans=0;
for(int i=1;i*i<=81*20;i++){
ans=(ans+dp2[20][i*i])%MOD;
}
std::cout<<ans<<"\n";
}
最終更新:2016年01月10日 12:34