zoukankan      html  css  js  c++  java
  • ACdream 1139(Sum-逆元)

    J - Sum

    Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

    Problem Description

    You are given an N*N digit matrix and you can get several horizontal or vertical digit strings from any position.

    For example:

    123

    456

    789

    In first row, you can get 6 digit strings totally, which are 1,2,3,12,23,123.

    In first column, you can get 6 digit strings totally, which are 1,4,7,14,47,147.

    We want to get all digit strings from each row and column, and write them on a paper. Now I wonder the sum of all number on the paper if we consider a digit string as a complete decimal number.

    Input

    The first line contains an integer N. (1 <= N <= 1000)

    In the next N lines each line contains a string with N digit.

    Output

    Output the answer after module 1,000,000,007(1e9+7)。

    Sample Input

    3
    123
    456
    789
    

    Sample Output

    2784

    本题暴力会T

    所以简化公式

    对于同行/列 须要累加的值为 a1*111+a2*22+a3*3

    发现规律sum=∑a(10^(n-i+1)-1)/9*i %F


    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<functional>
    #include<iostream>
    #include<cmath>
    #include<cctype>
    #include<ctime>
    using namespace std;
    #define For(i,n) for(int i=1;i<=n;i++)
    #define Fork(i,k,n) for(int i=k;i<=n;i++)
    #define Rep(i,n) for(int i=0;i<n;i++)
    #define ForD(i,n) for(int i=n;i;i--)
    #define RepD(i,n) for(int i=n;i>=0;i--)
    #define Forp(x) for(int p=pre[x];p;p=next[p])
    #define Lson (x<<1)
    #define Rson ((x<<1)+1)
    #define MEM(a) memset(a,0,sizeof(a));
    #define MEMI(a) memset(a,127,sizeof(a));
    #define MEMi(a) memset(a,128,sizeof(a));
    #define INF (2139062143)
    #define F (1000000007)
    #define MAXN (1000+10)
    long long mul(long long a,long long b){return (a*b)%F;}
    long long add(long long a,long long b){return (a+b)%F;}
    long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
    typedef long long ll;
    int n;
    char a[MAXN][MAXN];
    ll p10[MAXN]={0};
    ll pow2(ll b)  
    {
       if (b==1) return 10;  
       if (b==0) return 1;  
       if (p10[b]) return p10[b];
       ll p=pow2(b/2)%F;  
       p=(p*p)%F;  
       if (b&1)  
       {  
           p=(p*10)%F;  
       }  
       p10[b]=p;
       return p;  
    }  
    ll pow2(ll a,ll b)
    {
    	if (b==1) return a;
    	if (b==0) return 1;
    	ll p=pow2(a,b/2)%F;
    	p=p*p%F;
    	if (b&1)
    	{
    		p=(p*a)%F;
    	}
    	return p;
    }
    ll tot[MAXN]={0};
    ll mulinv(ll a)
    {
    	return pow2(a,F-2);
    }
    int main()
    {
    //	freopen("sum.in","r",stdin);
    //	freopen("sum.out","w",stdout);
    	scanf("%d",&n);
    	For(i,n)
    	{
    		scanf("%s",a[i]+1);
    		
    	}
    	/*
    	For(i,n)
    	{
    		For(j,n) cout<<a[i][j];
    		cout<<endl;
    	}
    	*/
    	For(i,n)
    	{
    		For(j,n) tot[i]+=a[i][j]-'0'+a[j][i]-'0';		
    	}
    	
    	
    //	For(i,n) cout<<tot[i]<<endl;
    	
    //	cout<<mul(pow2(10,1232),mulinv(pow2(10,1232)))<<endl;
    //	cout<<mulinv(9);
    
    	ll c9=mulinv(9);
    	
    	For(i,n) p10[i]=pow2(i);
    	
    	
    	ll ans=0;
    	For(i,n)
    	{
    		ll t=sub(p10[n-i+1],1),a=tot[i];
    		t=mul(t,c9);
    		t=mul(a,t);
    		ans=add(ans,mul(t,i));		
    	}
    	cout<<ans<<endl;
    	
    	
    	return 0;
    }
    





  • 相关阅读:
    Service Name Port Number Transport Protocol tcp udp 端口号16bit
    linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
    soft deletion Google SRE 保障数据完整性的手段
    Taylor series
    Taylor's theorem
    Moving average
    REQUEST
    Unix file types
    mysqld.sock
    Tunneling protocol
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7043938.html
Copyright © 2011-2022 走看看