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





  • 相关阅读:
    Win8系统 Python安装
    一些安卓开源框架整理
    Android 媒体键监听以及模拟媒体键盘的实现 demo
    android View 自动 GONE 问题
    Android 定时器TimerTask 简单使用
    关于Android studio 相对 eclipse 优点
    Java序列化与反序列化
    android shape的使用 边框
    Android Studio 修改 包名 package name
    Android WebView Long Press长按保存图片到手机
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7043938.html
Copyright © 2011-2022 走看看