题意:n*n的网格,(i,j)的编号为i+j,价值为编号位数中:偶数数字和奇数数字的差的绝对值 例如编号1222 价值为|2+2+2-1|=5.
T<=1e5,n<=1e6 求出n*n网格的总价值?
注意行与行之间的关系 第i行和第i-1行的编号除了首位和末位不同其它的都相同(第i行第x个等于第i-1行第x+1个).
设f[x]为数字x的价值,d[i]为第i行的总价值 则d[i]=d[i-1]-f[i-1+1]+f[i+i-1]+f[i+i]
T<=1e5,n<=1e6 求出n*n网格的总价值?
注意行与行之间的关系 第i行和第i-1行的编号除了首位和末位不同其它的都相同(第i行第x个等于第i-1行第x+1个).
设f[x]为数字x的价值,d[i]为第i行的总价值 则d[i]=d[i-1]-f[i-1+1]+f[i+i-1]+f[i+i]
设ans[i]为i*i网格的总价值, ans[i]=ans[i-1]+d[i]*2-f[i+i] 预处理一下即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
ll d[N],res[N],f[N*2];
ll calc(int x)
{
ll a=0,b=0;
while(x)
{
ll r=x%10;
x/=10;
if(r%2)
a+=r;
else
b+=r;
}
return abs(a-b);
}
void init()
{
for(int i=1;i<2*N;i++)
f[i]=calc(i);
res[1]=2,d[1]=2;
for(int i=2;i<N;i++)
{
d[i]=d[i-1]-f[i-1+1]+f[i-1+i]+f[i+i];
res[i]=res[i-1]+d[i]*2ll-f[i+i];
}
}
int main()
{
init();
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%lld\n",res[n]);
}
return 0;
}