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





  • 相关阅读:
    第06组 Alpha冲刺(6/6)
    第06组 Alpha冲刺(5/6)
    总结
    Vmware centos7无法联网的问题解决
    网络爬虫--前世今生
    CVE-2018-4407 漏洞复现POC
    编码原理_base64编码原理
    短信验证码之验证码回显
    2018_10_21 22:42
    信息安全考研和就业的选择分析
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7043938.html
Copyright © 2011-2022 走看看