Another Sum Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1480 Accepted Submission(s): 408
Problem Description
FunnyAC likes mathematics very much. He thinks mathematics is very funny and beautiful.When he solved a math problem he would be very happy just like getting accepted in ACM.Recently, he find a very strange problem.Everyone know that the sum of sequence from 1 to n is n*(n + 1)/2. But now if we create a sequence which consists of the sum of sequence from 1 to n. The new sequence is 1, 1+ 2, 1+2+3, .... 1+2+...+n. Now the problem is that what is the sum of the sequence from1 to 1+2+...+n .Is it very simple? I think you can solve it. Good luck!
Input
The first line contain an integer T .Then T cases followed. Each case contain an integer n (1 <= n <= 10000000).
Output
For each case,output the sum of first n items in the new sequence. Because the sum is very larger, so output sum % 20090524.
Sample Input
3 1 24 56
Sample Output
1 2600 30856//这个代码一直超时,也想不出其他的代码了,先贴上。#include<stdio.h> #include<string.h> #define mod 20090524 int main() { int t,n,m; int i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); m=0; for(i=n,j=1;i>=1;i--,j++) { m=(m+i*j%mod)%mod; } printf("%d\n",m); } return 0; }
//这个是大神写的,还不懂啥意思。#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define mod 20090524; using namespace std; __int64 sum[4][4],array[4][4]; void MatrixMult(__int64 a[4][4],__int64 b[4][4]) { __int64 c[4][4]={0}; for(int i=0;i<4;++i) { for(int j=0;j<4;++j) { for(int k=0;k<4;++k) { c[i][j]+=a[i][k]*b[k][j]; } } } for(int i=0;i<4;++i) { for(int j=0;j<4;++j) a[i][j]=c[i][j]%mod; } } __int64 MatrixPow(int k) { for(int i=0;i<4;++i) { for(int j=0;j<4;++j) sum[i][j]=(i == j); } array[0][0]=array[0][1]=array[0][2]=1,array[0][3]=0; array[1][1]=array[1][2]=1,array[1][0]=array[1][3]=0; array[2][2]=array[2][3]=1,array[2][0]=array[2][1]=0; array[3][3]=1,array[3][0]=array[3][1]=array[3][0]=0; while(k) { if(k&1) MatrixMult(sum,array); MatrixMult(array,array); k>>=1; } return (sum[0][2]+sum[0][3])%mod; } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%I64d\n",MatrixPow(n)); } return 0; }