您的位置:首页 > 其它

LightOJ 1213 (Fantasy of a Summation )

2018-02-01 18:04 507 查看
#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\n", ++caseno, res);

    }

    return 0;
}

题意:求那段程序的res值

题解:可以想到每个a[i]加的次数一样多,那我们算一下总次数然后平均一下,就可以得到每个数字加的次数。

可以得到总的次数为(n^k)*k,因为有n个数字,所以每个数字加了(n^(k-1))*k次

所以算一下n个数字的和,然后答案就是(n^(k-1))*k*sum

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#include <math.h>
using namespace std;

typedef long long ll;
ll power(ll a,ll b,ll mod)
{
ll ans=1,c=a;
while(b)
{
if(b&1)
ans=(ans*c)%mod;

c=(c*c)%mod;
b=b/2;
}
return ans;
}
ll a[1005];
int main()
{
ll n,m;
int t,cas=1;
cin>>t;
while(t--)
{
ll mod,k;
cin>>n>>k>>mod;
ll ans=0;
for(int i=0;i<n;i++) {cin>>a[i];ans=ans+(a[i]%mod);ans=ans%mod;}
ans=(ans*(power(n,k-1,mod)*k)%mod)%mod;
printf("Case %d: %lld\n",cas++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: