构造题(数论)

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
            意解: 这道题可以直接把所有情况列出来,就可以看出规律了,再不清楚往下看吧!; 预处理一下,提高效率;
               举个例子:1,2,3,有以下情况
                                 1        2        3
                                 12      23
                                 123

           
           AC代码:
          
<span style="font-size:12px;">/*
* this code is made by eagle
* Problem: 1139
* Verdict: Accepted
* Submission Date: 2014-11-02 17:03:56
* Time: 44MS
* Memory: 2868KB
*/
#include <iostream>
#include <cstdio>
 
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll dp[1100];
 
void make_num()
{
    for(int i = 1; i <= 1000; i++)
    {
        dp[i] = (dp[i - 1] * 10 + 1) % mod;
    }
}
 
char s[1100][1100];
int main()
{
    make_num();
    int n;
    ll ans = 0;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        scanf("%s",s + i);
        for(int j = 0; j < n; j++)
        {
            ll x = (ll)(s[i][j] - '0');
            ll t = j + 1;
            ans = (ans + t * dp[n - t + 1] % mod * x) % mod;
        }
    }
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            ll x = (ll)(s[j][i] - '0');
            ll t = j + 1;
            ans = (ans + t * dp[n - t + 1] % mod * x) % mod;
        }
    }
    printf("%lld\n",ans);
    return 0;
}</span>

A - ACfun

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Problem Description
As a former ACMer, "AC" is a special abbreviated word which can bring much pleasure to me. Sometimes it means everything.
This problem is about "AC".
One day, I write a long string S on the paper which contains "A" and "C". Now I want to find a lexicographic minimum string T satisfied that T is distinct with all substring of S.
Input
The first line of input file contains an integer T indicating the number of case.
In each test case:
Input a string S consist of "A" and "C". The length of S is not large than 100.
Output
For each test case:
You should output the string T meet the condition.
Sample Input
1
ACAC
Sample Output
AA
        意解:这道题其实就是个很简单的题目,作者把他转了个弯,晕.................
        AC代码:

      
/*
* this code is made by eagle
* Problem: 1125
* Verdict: Accepted
* Submission Date: 2014-11-02 16:28:05
* Time: 0MS
* Memory: 1676KB
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
 
using namespace std;
 
int main()
{
    int T;
    char s[110];
    scanf("%d",&T);
    while(T--)
    {
       int ans = 0;
       scanf("%s",s);
       for(int i = 0; s[i]; i++)
       {
           int t = 0;
           if(s[i] == 'A')
           {
               while(s[i])
               {
                   if(s[i] == 'A')
                   {
                       t++;
                       i++;
                   }
                   else break;
               }
               ans = max(t,ans);
               if(s[i] == 0) break; //这里要加这句话,不然会出现越界导致答案出错;
           }
       }
       cout<<string(ans + 1,'A')<<endl;
    }
    return 0;
}

Revenge of Segment Tree


Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2297    Accepted Submission(s): 465


Problem Description
   
   
In computer science, a segment tree is a tree data structure for storing intervals, or segments. It allows querying which of the stored segments contain a given point. It is, in principle, a static structure; that is, its content cannot be modified once the structure is built. A similar data structure is the interval tree. A segment tree for a set I of n intervals uses O(n log n) storage and can be built in O(n log n) time. Segment trees support searching for all the intervals that contain a query point in O(log n + k), k being the number of retrieved intervals or segments. ---Wikipedia Today, Segment Tree takes revenge on you. As Segment Tree can answer the sum query of a interval sequence easily, your task is calculating the sum of the sum of all continuous sub-sequences of a given number sequence.
 
Input
   
   
The first line contains a single integer T, indicating the number of test cases. Each test case begins with an integer N, indicating the length of the sequence. Then N integer Ai follows, indicating the sequence. [Technical Specification] 1. 1 <= T <= 10 2. 1 <= N <= 447 000 3. 0 <= Ai <= 1 000 000 000
 
Output
   
   
For each test case, output the answer mod 1 000 000 007.
 
Sample Input
   
   
2 1 2 3 1 2 3
 
Sample Output
   
   
2 20
Hint
For the second test case, all continuous sub-sequences are [1], [2], [3], [1, 2], [2, 3] and [1, 2, 3]. So the sum of the sum of the sub-sequences is 1 + 2 + 3 + 3 + 5 + 6 = 20. Huge input, faster I/O method is recommended. And as N is rather big, too straightforward algorithm (for example, O(N^2)) will lead Time Limit Exceeded. And one more little helpful hint, be careful about the overflow of int. 意解: 这道题是前面一道的简化搬,乱搞; 举个例子:1,2,3,有以下情况 1 2 3 12 23 123 这样可以看出规律的吧! AC代码:
#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
const int M = 1e6;
const int mod = 1e9 + 7;

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--){
        ll ans = 0,t;
        scanf("%d",&n);
        t = n;
        for(int i = 1; i <= n; i++)
        {
            ll x;
            scanf("%I64d",&x);
            ans = (ans + t * x % mod * i % mod) % mod;
            t--;
        }
        cout<<ans<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值