刷点 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)
将除法换为乘法后可以用快速幂解决;

浙公网安备 33010602011771号