题干:
求该代码的结果
#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;
}
思路:
分析一下题意,是做了 n k n^k nk次加法运算,其中i1进行了n次,i2进行了 n 2 n^2 n2,i3进行了 n 3 n^3 n3…以此类推。设A[]的和为sum,根据排列组合res=n^(k-1) * k * sum%mod. n^(k-1)使用快速幂计算。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int x[110000],mod;
long long qc(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans%mod;
}
int main()
{
int t,n,k;
scanf("%d",&t);
for(int j=1;j<=t;j++){
scanf("%d%d%d",&n,&k,&mod);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
long long ans=0;
for(int i=0;i<n;i++)
ans=(ans+x[i])%mod;
long long sum=ans;
ans=qc(n,k-1);
printf("Case %d: %lld\n",j,(ans*sum*k%mod)%mod);
}
return 0;
}