Problem: Problem F and F2 are the same problem, but with different constraints and time limits.

We have a board divided into N horizontal rows and N vertical columns of square cells. The cell at the i-th row from the top and the j-th column from the left is called Cell (i,j). Each cell is either empty or occupied by an obstacle. Also, each empty cell has a digit written on it. If A_{i,j}= `1`, `2`, ..., or `9`, Cell (i,j) is empty and the digit A_{i,j} is written on it. If A_{i,j}= `#`, Cell (i,j) is occupied by an obstacle.

Cell Y is reachable from cell X when the following conditions are all met:

* Cells X and Y are different.
* Cells X and Y are both empty.
* One can reach from Cell X to Cell Y by repeatedly moving right or down to an adjacent empty cell.



Consider all pairs of cells (X,Y) such that cell Y is reachable from cell X. Find the sum of the products of the digits written on cell X and cell Y for all of those pairs.

Constraints

* 1 \leq N \leq 500
* A_{i,j} is one of the following characters: `1`, `2`, ... `9` and `#`.

Input

Input is given from Standard Input in the following format:


N
A_{1,1}A_{1,2}...A_{1,N}
A_{2,1}A_{2,2}...A_{2,N}
:
A_{N,1}A_{N,2}...A_{N,N}


Output

Print the sum of the products of the digits written on cell X and cell Y for all pairs (X,Y) such that cell Y is reachable from cell X.

Examples

Input

2
11
11


Output

5


Input

4
1111
11#1
1#11
1111


Output

47


Input

10
76##63##3#
8445669721
75#9542133
3#285##445
749632##89
2458##9515
5952578#77
1#3#44196#
4355#99#1#
298#63587


Output

36065


Input

10
4177143673
7#########
5#1716155#
6#4#####5#
2#3#597#6#
6#9#8#3#5#
5#2#899#9#
1#6#####6#
6#5359657#
5#########


Output

6525

Solution (in CPP):

Solution:
#pragma GCC optimize("-O3","-funroll-all-loops")
#pragma GCC target("avx","tune=native","sse4","sse")
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define fe first
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
int n,c=0,T=0;
char a[505][505];
pii u[2][505][505];
inline pii operator + (pii a,pii b)
{return pii(min(a.fi,b.fi),max(a.se,b.se));}
int vis[505][505];
inline void dfs(int x,int y)
{
	if(vis[x][y]==T||!isdigit(a[x][y]))
		return;
	vis[x][y]=T; dfs(x,y+1); dfs(x+1,y);
}
int su[505][505];
int main()
{
	scanf("%d",&n);
	ll aa=0;
	for(int i=1;i<=n;++i)
	{
		scanf("%s",a[i]+1);
		for(int j=1;j<=n;++j)
		{
			if(isdigit(a[i][j]))
			{
				int u=a[i][j]-'0';
				aa-=u*u;
			}
		}
	}
	pii GG(2e9,-2e9);
	for(int i=0;i<=n+1;++i)
	for(int j=0;j<=n+1;++j)
		u[0][i][j]=u[1][j][i]=GG;
	for(int i=n;i>=1;--i)
	{
		T=i; c^=1;
		for(int j=1;j<=n;++j) dfs(i,j);
		for(int k=i;k<=n;++k)
			for(int w=1;w<=n;++w)
				if(vis[k][w]==T)
					su[k][w]=su[k][w-1]+a[k][w]-'0';
				else su[k][w]=su[k][w-1];
		for(int j=n;j>=1;--j)
		{
			pii*ucj=u[c][j],*ucp=u[c][j+1],*rcj=u[c^1][j];
			if(!isdigit(a[i][j]))
			{
				for(int k=i;k<=n;++k)
					ucj[k]=GG;
				continue;
			}
			ucj[i]=pii(j,j)+ucp[i];
			ll ap=0;
			if(ucj[i].fi<=ucj[i].se)
				ap+=su[i][ucj[i].se]-su[i][ucj[i].fi-1];
			for(int k=i+1;k<=n;++k)
			{
				ucj[k]=rcj[k]+ucp[k];
				if(ucj[k].fi<=ucj[k].se)
				ap+=su[k][ucj[k].se]-su[k][ucj[k].fi-1];
			}
			aa+=ap*(a[i][j]-'0');
		}
	}
	cout<<aa<<"\n";
}