zoukankan      html  css  js  c++  java
  • HDU2114 Calculate S(n) (取模算术)

    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-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;
    }
  • 相关阅读:
    【转】卡特兰数四个公式(简单)
    【基础算法-ST表】入门 -C++
    【题解】[Nwerc 2006]escape -C++
    C#高级编程第11版
    C#高级编程第11版
    C#高级编程第11版
    C#高级编程第11版
    C#高级编程第11版
    109th LeetCode Weekly Contest Knight Dialer
    109th LeetCode Weekly Contest Number of Recent Calls
  • 原文地址:https://www.cnblogs.com/ZP-Better/p/4639624.html
Copyright © 2011-2022 走看看