您的位置:首页 > 其它

【找规律 && 快速幂 && 概率论】LightOJ - 1213 Fantasy of a Summation

2017-10-17 11:03 423 查看
Problem Description

#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, mod,让你实现上述程序

思路:

显然暴力超时,n^k。模拟下算的过程,就会发现可以考虑每个数加了多少次,看最后一排的第一个数,加了n^(k - 1)次,每一排的第一个数加的次数是一样的,那么第一个数加了k*n^(k-1)次。所有数都加了那么多次,就是和sum*k*n^(k-1)。因为k很大所以套一个快速幂

#include<bits/stdc++.h>
using namespace std;
long long Pow(long long n, long long k, long long mod)//快速幂
{
long long sum = 1;
while(k)
{
if(k&1) sum = (sum * n) % mod;
n = (n*n) % mod;
k >>= 1;
}
return sum;
}
int main()
{
int T, i, Case;
long long  n, k, mod;
scanf("%d", &T);
for(Case = 1; Case <= T; Case++)
{
scanf("%lld %lld %lld\n", &n, &k, &mod);
long long sum = 0, num;
for(i = 0; i < n; i++)
{
scanf("%lld", &num);
sum += num;
}//求和
printf("Case %d: %lld\n", Case, sum * ((k * Pow(n, k-1, mod))%mod)%mod );//输出
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: