HDU2114 Calculate S(n) (取模算术)

时间:2024-01-13 13:23:50

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 .

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-;
const double PI=acos(-1.0);
#define maxn 10005
long long a[maxn];
int main()
{
long long sum = ;
for(int i = ; i <= ; i++)
{
sum += (i%*i%*i%)%;
sum = sum %;
a[i] = sum;
}
int n;
while(~scanf("%d", &n))
{
if(n <= )
{
printf("%04d\n",a[n]);
}
else
{
int t = n/;
int k = n - t*;
long long sum1 = ;
sum1 = ((t%)*(a[]%))% + a[k]%;
printf("%04d\n",sum1); }
}
return ;
}

方法二:直接公式

#include <stdio.h>
int main()
{
__int64 n,sum;
while (scanf("%I64d",&n)!=EOF)
{
sum=;
n=n%;
sum=(n*(n+)/)*(n*(n+)/)%;// 为了防止计算sum中乘法溢出将n=n%10000;因为要求得后4位数。
printf("%04I64d\n",sum);
}
return ;
}