LightOJ - 1328 A Gift from the Setter (数学)

来源:互联网 发布:梦洁床垫怎么样知乎 编辑:程序博客网 时间:2024/05/19 15:22
LightOJ - 1328
A Gift from the Setter
Time Limit:                                                        2000MS                       Memory Limit: 32768KB64bit IO Format:                            %lld & %llu                       

SubmitStatus

Description

Problem setting is somewhat of a cruel task of throwing something at the contestants and having them scratch their head to derive a solution. In this problem, the setter is a bit kind and has decided to gift the contestants an algorithm which they should code and submit. The C/C++ equivalent code of the algorithm is given below:

longlongGetDiffSum(inta[],intn)
{
  
longlongsum=0;
  
inti,j;
  
for(i=0;i<n;i++)
      
for(j=i+1;j<n;j++)
            sum
+=abs(a[i]-a[j]);// abs means absolute value
  
returnsum;
}

The values of array a[] are generated by the following recurrence relation:

a[i] = (K * a[i-1] + C) % 1000007 for i > 0

where K, C and a[0] are predefined values. In this problem, given the values ofK, C, n and a[0], you have find the result of the function

"long long GetDiffSum( int a[], int n )"

But the setter soon realizes that the straight forward implementation of the code is not efficient enough and may return the famous "TLE" and that's why he asks you to optimize the code.

Input

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

Each case contains four integers K, C, n and a[0]. You can assume that(1 ≤ K, C, a[0] ≤ 104) and (2 ≤ n ≤ 105).

Output

For each case, print the case number and the value returned by the function as stated above.

Sample Input

2

1 1 2 1

10 10 10 5

Sample Output

Case 1: 1

Case 2: 7136758

Hint

Source

Problem Setter: Shamim Hafiz
Special Thanks: Jane Alam Jan, Sohel Hafiz
//题意:先告诉你计算a[i]的公式:a[i]=(k*a[i-1]+c)%1000007;
输入k,c,n,a[0],让你先求出有n个值的序列a[i],然后根据题中给出的计算sum的公式,计算出sum。
//思路:
很简单的一个题,求出来a[i]后,将它们从小到大排序(消除掉取绝对值),因为n是100000,所以两重for肯定会超时,所以就用一个前缀和数组sum记录,根据sum数组进行操作,一重for就行了。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#define ll long long#define N 100010#define M 1000007using namespace std;ll a[N];ll sum[N];int main(){int t,T=1;int k,c,n,m;int i,j;scanf("%d",&t);while(t--){scanf("%d%d%d%d",&k,&c,&n,&m);a[0]=m;for(i=1;i<n;i++)a[i]=(k*a[i-1]+c)%M;sort(a,a+n);for(i=0;i<n;i++)sum[i]=sum[i-1]+a[i];ll num=0;for(i=0;i<n;i++){num+=sum[n-1]-sum[i-1]-a[i]*(n-i);}printf("Case %d: %lld\n",T++,num);}return 0;}

 
0 0
原创粉丝点击