J - Sum
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
Problem Description
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
In each test case:
Input a string S consist of "A" and "C". The length of S is not large than 100.
Output
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
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.
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
For each test case, output the answer mod 1 000 000 007.
2 1 2 3 1 2 3
2 20HintFor 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; }