题目地址:http://lightoj.com/volume_showproblem.php?problem=1213
很简单的一道题。
res = ( res + A[i1] + A[i2] + … + A[iK] ) % MOD;
你会发现A[i1] 出现的次数是nk,k个循环,一个循环n次。那么a[0]在a[i1] 出现的次数为nk-1,可以看出a[i](0<=i<n ) 在a[i1] 出现的次数为nk-1**。a[i]在从 A[i1] 到 A[iK],出现的的次数为 knk-1.所以res=k* nk-1*(a[0]+a[1]+…+a[n-1]**)。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int quickmod(int n,int m,int mod)
{
int b=1;
while(m>0)
{
if(m&1)
b=b*n%mod;
n=n*n%mod;
m=m>>1;
}
return b;
}
int a[10006];
int main()
{
int t,ans1;
int n,k,mod;
scanf("%d",&t);
ans1=1;
while(t--)
{
int ans=0;
scanf("%d%d%d",&n,&k,&mod);
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=(a[i]%mod);
sum%=mod;
}
ans=quickmod(n,k-1,mod);
k=k%mod;
ans=ans*k%mod;
ans=ans*sum%mod;
printf("Case %d: %d\n",ans1,ans);
ans1++;
}
return 0;
}