#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;typedeflonglong LL;constint N =110, mod =1e9+7;int n, m;
LL s[N][N], c[N][N];
LL f[N][N][N];voidget_prefix(int i){for(int j =1; j <= m; j ++)for(int k =1; k <= m; k ++)
s[j][k]=(s[j -1][k]+ s[j][k -1]- s[j -1][k -1]+ f[i][j][k])% mod;}
LL get_sum(int x1,int y1,int x2,int y2){return s[x2][y2]- s[x2][y1 -1]- s[x1 -1][y2]+ s[x1 -1][y1 -1];}intmain(){scanf("%d%d",&n,&m);char str[N];for(int i = n; i; i --){
cin >> str +1;for(int j =1; j <= m; j ++){
c[i][j]= c[i][j -1]+(str[j]=='X');}}
f[0][1][m]=1;get_prefix(0);
LL res =1;for(int i =1; i <= n; i ++){for(int j =1; j <= m; j ++)for(int k = j; k <= m; k ++){if(c[i][k]- c[i][j -1]==0){
LL &x = f[i][j][k];
x =(x +get_sum(1, k, j, m))% mod;
res =(res + x)% mod;}}get_prefix(i);}printf("%lld\n",(res + mod)% mod);return0;}
矩阵求和
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;typedeflonglong LL;constint N =1e7+9, mod =1e9+7;
LL euler[N], primes[N];bool st[N];
LL s[N];int n, cnt;voidget_eulers(int n)// 线性筛法求1~n的欧拉函数{
euler[1]=1;for(int i =2; i <= n; i ++){if(!st[i]){
primes[cnt ++]= i;
euler[i]= i -1;}for(int j =0; primes[j]<= n / i; j ++){int t = primes[j]* i;
st[t]=true;if(i % primes[j]==0){
euler[t]= euler[i]* primes[j];break;}
euler[t]= euler[i]*(primes[j]-1);}}
s[1]=1;for(int i =2; i <= n; i ++)
s[i]=(s[i -1]+2* euler[i])% mod;}intmain(){
cin >> n;get_eulers(n);
LL res =0;for(int d =1; d <= n; d ++)
res =(res + s[n / d]* d % mod * d)% mod;printf("%lld\n", res);return0;}