Calculate S(n)
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9102 Accepted Submission(s): 3325
Problem Description
Calculate S(n).
S(n)=13+23 +33 +......+n3 .
S(n)=13+23 +33 +......+n3 .
Input
Each line will contain one integer N(1 < n < 1000000000). Process to end of file.
Output
For each case, output the last four dights of S(N) in one line.
Sample Input
1
2
Sample Output
0001
0009
Author
天邪
方法一:全算出来。
思路:当n>10000以后,只用关心后四位的数字即可。
知识点:模算术公式:(a+b)%n = ((a%n)+(b%n))%n
(a-b)%n = ((a%n)-(b%n))%n
a*b%n = (a%n)*(b%n)%n
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-10; const double PI=acos(-1.0); #define maxn 10005 long long a[maxn]; int main() { long long sum = 0; for(int i = 1; i <= 10000; i++) { sum += (i%10000*i%10000*i%10000)%10000; sum = sum %10000; a[i] = sum; } int n; while(~scanf("%d", &n)) { if(n <= 10000) { printf("%04d ",a[n]); } else { int t = n/10000; int k = n - t*10000; long long sum1 = 0; sum1 = ((t%10000)*(a[10000]%10000))%10000 + a[k]%10000; printf("%04d ",sum1); } } return 0; }
方法二:直接公式
#include <stdio.h> int main() { __int64 n,sum; while (scanf("%I64d",&n)!=EOF) { sum=0; n=n%10000; sum=(n*(n+1)/2)*(n*(n+1)/2)%10000;// 为了防止计算sum中乘法溢出将n=n%10000;因为要求得后4位数。 printf("%04I64d ",sum); } return 0; }