刷点 kick start _ 0

整理一些 ks 的题目和考点。

一、Number Guesing

作为interactIve问题,形式还是蛮新颖的,需要使用离线jud,在py cmd上运行代码

python interactive_runner.py python testing_tool.py 0 -- ./my_binary

在interactive_runner.py文件注释中,其他按提示走。

二、Mural

有一个session的壁画,每一天可以选则一面墙凃油漆,从第二次涂色开始,每一次涂的墙壁要与已经涂过的相邻,洪水会在这个session的两侧毁掉一面墙;

凃油漆可以保留墙上的数值不被洪水毁掉,求保留的数值最大是多少;

 

每个dataset中都有N/2(向下取整)面墙被毁,所以涂过的为N - N/2面

可以把相连的N - N/2面墙被涂的所有可能性的得分都计算出来再取最值,暴力即可求解

for exactly one case N <= 1e+6,for other T - 1 cases N <= 100

O(n)时数量级1e+6 << 1e+9,而1e+9近似一秒

 

方法:滚动窗口

设窗口长度为K,N个数据,每一次对K个数据进行乘或加的运算,复杂度为O(N * K)

 1 for(int k = 0;k + i <= n;k ++)
 2 {
 3     long temp = 0;
 4     for(int j = 0;j < i;j ++)
 5     {
 6         temp += arr[k+j];
 7     }
 8     if(temp>sum)
 9     {
10         sum = temp;
11     }
12 }

而采用滚动的方法复杂度近似O(N)

for(int k = 0;k < i;k ++)
{
        temp += arr[k];
}
sum = temp;
for(int k = 0;k + i <= n;k ++)
{
       temp = temp - arr[k] + arr[k+i];
       if(temp>sum)
       {
            sum = temp;
       }
}

三、Kickstart Alam

 

总结一下经验:
对于Aj如果闹钟响了k次,Aj做 [ Aj1 Aj2 ... Ajn] 中的第i个数,有N - j + 1个有续集满足这个条件,这取决于[Aj1 Aj2 ...Aj ... Ajn ]中Aj后面能取的数字的个数(因为A是A_N的contiguous subarrays)如果数组含有Aj了那么A   ==  [:Aj ... An]。j...n是连续的数字串;

 

1.构建数学表达式:

Aj 的系数 Px = Aj * (N - j + 1)Σ公比为从1到j的等比数列前k项和 

前k项和用等比数列求和公式,出于对j求至k次幂数值较大采用快速幂:

#define MOD 1000000007
typedef unsigned long long ull;


ull fp(int j,int k)
{
    if(k == 0);
        return 1;
    ull ans = fp(j,k/2);
    if(k % 2 == 0 )
        return ans*ans % MOD;
    else
        return ans*ans % MOD * j %MOD;
}

 

2.滚动加和:
为了避免Σj**k的重复计算;在

j :1 :N

的同时令

t += t + Σj**k;

 

3.费马小定理,求分数对质数的mod:

ap≡ a (mod p)

而如果 a与p 互质则有

ap-1≡1(mod p)  即 ap-1 (mod p) =  1

于是有

j * (jk - 1) / (j-1) 

中有

(j-1)p-2= 1 / (j - 1)

这意味着

j * (jk - 1) / (j - 1)   (mod MOD)  = j * (jk - 1) * (j - 1)MOD-2   (mod MOD)

将除法换为乘法后可以用快速幂解决;

posted @ 2020-02-17 00:07  LceOmlet  阅读(158)  评论(0)    收藏  举报