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;
    }
    





  • 相关阅读:
    没时间写文章::>_<::
    使 iis 支持 flv 视频播放
    CentOS7系统配置国内yum源(阿里云)
    android adb启动失败问题 adb server is out of date. killing... ADB server didn't ACK * failed to start daemon *
    android开发 获取手机分辨率大小
    c++流操作>rdbuf()
    ROR:Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'
    android map如何获得Google Map API key
    Android有效解决加载大图片时内存溢出的问题
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7043938.html
Copyright © 2011-2022 走看看