zoukankan      html  css  js  c++  java
  • 1213

    1213 - Fantasy of a Summation
     
     
     
     

    If you think codes, eat codes then sometimes you may get stressed. In your dreams you may see huge codes, as I have seen once. Here is the code I saw in my dream.

    #include <stdio.h>

    int cases, caseno;
    int n, K, MOD;
    int A[1001];

    int main() {
        scanf("%d", &cases);
        while( cases-- ) {
            scanf("%d %d %d", &n, &K, &MOD);

            int i, i1, i2, i3, ... , iK;

            for( i = 0; i < n; i++ ) scanf("%d", &A[i]);

            int res = 0;
            for( i1 = 0; i1 < n; i1++ ) {
                for( i2 = 0; i2 < n; i2++ ) {
                    for( i3 = 0; i3 < n; i3++ ) {
                        ...
                        for( iK = 0; iK < n; iK++ ) {
                            res = ( res + A[i1] + A[i2] + ... + A[iK] ) % MOD;
                        }
                        ...
                    }
                }
            }
            printf("Case %d: %d ", ++caseno, res);
        }
        return 0;
    }

    Actually the code was about: 'You are given three integers nKMOD and n integers: A0, A1, A2 ... An-1, you have to write K nested loops and calculate the summation of all Ai where i is the value of any nested loop variable.'

    Input

    Input starts with an integer T (≤ 100), denoting the number of test cases.

    Each case starts with three integers: n (1 ≤ n ≤ 1000), K (1 ≤ K < 231), MOD (1 ≤ MOD ≤ 35000). The next line contains n non-negative integers denoting A0, A1, A2 ... An-1. Each of these integers will be fit into a 32 bit signed integer.

    Output

    For each case, print the case number and result of the code.

    Sample Input

    Output for Sample Input

    2

    3 1 35000

    1 2 3

    2 3 35000

    1 2

    Case 1: 6

    Case 2: 36

     分析:由题得, 程序执行了n^k次加法, 每次取k个数, 并且每个数出现的次数是相等的为n^k * k/n次。
    sum = (a0+a1+...an)%mod;
    ans = (sum+k*n^k-1)%mod;
       
    结合律
    ((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
    ((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
    交换律
    (a + b) mod p = (b+a) mod p
    (a × b) mod p = (b × a) mod p
    分配律
    ((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
    (a×b) mod c=(a mod c * b mod c) mod c
    (a+b) mod c=(a mod c+ b mod c) mod c
    (a-b) mod c=(a mod c- b mod c) mod c
    代码:
     
     #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>

    using namespace std;
    typedef long long ll;

    #define N 11000
    int mod;

    ll qpow(int a, int b)
    {
        if(b == 0)
            return 1;

        ll tmp = qpow(a, b>>1);

        tmp = tmp * tmp % mod;


        if(b & 1)
           tmp =(ll) (tmp * (a % mod) )% mod;

        return tmp;

    }

    int main()
    {
        int T, cas;
        int n, k;
        int num[N];

        scanf("%d", &T);

        cas = 0;

        while(T--)
        {
            cas++;
            scanf("%d%d%d", &n, &k, &mod);

            ll sum = 0;
            for(int i = 0; i < n; i++)
            {
                 scanf("%d", &num[i]);

                 sum = (sum + num[i] % mod) % mod;
            }

            ll ans = qpow(n, k-1);
            ll cnt = (ans % mod * k % mod * sum % mod) % mod;

            printf("Case %d: %lld ", cas, cnt);

        }
        return 0;
    }
     
  • 相关阅读:
    HDU1852 Beijing 2008(快速幂+特殊公式)
    HihoCoder 1570 : 小Hi与法阵(简单几何)
    【转】反素数
    【整理】线段树30题
    SPOJcot2 Count on a tree II (树上莫队)
    【总结】曼哈顿距离转切比雪夫距离
    【初识】树上分块
    基于Tablestore Tunnel的数据复制实战
    【New Feature】阿里云快照服务技术解析
    基于日志服务的GrowthHacking(1):数据埋点和采集(APP、Web、邮件、短信、二维码埋点技术)
  • 原文地址:https://www.cnblogs.com/dll6/p/7655051.html
Copyright © 2011-2022 走看看