k-1

noip模拟测试15

隐身守侯 提交于 2020-02-06 22:41:42
T1:建设城市(city)   第一眼看是组合,然后看到k的限制发现是容斥   用插板法加容斥得出:$\sum_{i=0}^{m-i*k-1 \leq n-1}C_n^i*C_{m-i*k-1}^{n-1}*(-1)^i$   但发现$n$的范围是$10^9$,组合数计算是$O(n)$的   但又发现$m$的范围是$10^7$,所以特判$n>m$的情况就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 #define ll long long 9 using namespace std; 10 const int MAXN=10000005; 11 const ll D=998244353; 12 ll n,m,k,ans,fac[MAXN],inv[MAXN]; 13 ll qpow(ll x,ll k) { 14 ll ret=1; 15 while(k) { 16 if(k&1) ret=ret*x%D; 17 x=x*x%D; 18 k>>=1; 19 } 20 return ret; 21 } 22 void first() { 23 fac

神奇的幻方

徘徊边缘 提交于 2020-02-01 20:06:41
幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,.....N x N 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 K (K=2,3,...,N x N) : 1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列; 2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行; 3.若 (K-1) 在第一行最后一列,则将 K 填在 (K-1) 的正下方; 4.若 (K-1) 既不在第一行,也最后一列,如果 (K-1) 的右上方还未填数,则将 K 填在 (K-1) 的右上方,否则将 L 填在 (K-1) 的正下方。 输入描述: 一个正整数 N ,即幻方的大小。 输出描述: 共 N 行 ,每行 N 个整数,即按上述方法构造出的 N x N 的幻方,相邻两个整数之间用单空格隔开。 示例1 输入 3 输出 8 1 6 3 5 7 4 9 2 示例2 输入 25 输出 327 354 381 408 435 462 489 516 543 570 597 624 1 28 55 82 109 136 163 190 217 244 271 298 325 353 380 407

Coin Toss(uva 10328,动态规划递推,限制条件,至少转至多,高精度)

好久不见. 提交于 2020-01-28 03:20:58
有n张牌,求出至少有k张牌连续是正面的排列的种数。(1=<k<=n<=100) Toss is an important part of any event. When everything becomes equal toss is the ultimate decider. Normally a fair coin is used for Toss. A coin has two sides head(H) and tail(T). Superstition may work in case of choosing head or tail. If anyone becomes winner choosing head he always wants to choose head. Nobody believes that his winning chance is 50-50. However in this problem we will deal with a fair coin and n times tossing of such a coin. The result of such a tossing can be represented by a string. Such as if 3 times tossing is used then there are

[USACO][DP]Cow pedigrees

雨燕双飞 提交于 2020-01-26 04:57:47
二叉树dp,一般两种分类思路: 1、分层 2、分左右子树 这种分类方法是不是很熟悉?对,我们遍历二叉树也是这样的思路。这里我使用了分左右子树行态进行讨论的方法来递归。 根据题目,记拥有k个层、n个节点的所求树有(k,n)种行态。那么只有2*K-1 <=N && N <= upper[K]-1且N为奇数的时候有解。 画一画基本情况: (1,1) = 1 (2,3) = 1 (3,5) = 2; (3,7) = 1 研究第四层,可以发觉 (4,7)分左右子树可以看成(4,6+1),那么只要把6分出去、并且保证分完还是4层就可以;要保持4层,一个分出去的就必须是(3,?)。于是得到递推式: (k,n) = (k,n-1 + 1) = sum_t (k-1,m) + (t, n - 1 -ml) 其中m为[2*(k-1) - 1, 2^{k-1}-1]中的奇数,t为所在数对拥有第二坐标为n-1-m的任何第一坐标。 题目要取模,别忘了取模。 用数组存然后如上递推的话,需要四层循环:一层是递推给k的,二层是给k对应n的,三层是找l,四层是找m。 这里关于循环上界,并不需要算pow(2,*),因为我们要求的N是给出的,而需要的第二维数字不需要比N大,所以构造循环。关键代码如下: for ( int k = 4 ; k <= K ; k ++ ) { for ( int n = 2 * k - 1

外部排序&多路归并排序

有些话、适合烂在心里 提交于 2020-01-23 07:50:39
外部排序: 一、定义问题 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序 整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排 序的子文件进行多路归并排序。 二、处理过程 ( 1)按可用内存的大小,把外存上含有 n个记录的文件分成若干个长度为 L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存; ( 2)对这些有序子文件逐趟归并,使其逐渐由小到大,直至得到整个有序文件为止。 先从一个例子来看外排序中的归并是如何进行的? 假设有一个含10000 个记录的文件,首先通过10 次内部排序得到10 个初始归并段R1~R10 ,其中每一段都含1000 个记录。然后对它们作如图10.11 所示的两两归并,直至得到一个有序文件为止 如下图 三 、多路归并排序算法以及败者树 多路归并排序算法在常见数据结构书中都有涉及。从2路到多路(k路),增大k可以减少外存信息读写时间,但k个归并段中选取最小的记录需要比较k-1次, 为得到u个记录的一个有序段共需要(u-1)(k-1)次,若归并趟数为s次,那么对n个记录的文件进行外排时

SVM非线性MATLAB实现

旧巷老猫 提交于 2020-01-07 17:42:49
应用了高斯核 clear,没有画ROC曲线 tic load('C:\Users\Administrator\Desktop\Cancer.mat') mu=Cancer(1:444,:);zi=Cancer(445:end,:); %整理数据,第一列(1,2)作为标签 cycle_N=1; %进行cycle_N次交叉验证 N=10; %N=10十折 c=100; [N1,col]=size(mu); [N2,col]=size(zi); q1=floor(N1/N);q2=floor(N2/N); %ACC=zeros(1,10);MCC=zeros(1,10);F1=zeros(1,10); %TP_ROC=zeros(1,10);FP_ROC=zeros(1,10); for kk=1:cycle_N %进行NN次交叉训练 for k=1:N %每次交叉训练为N折 if k==1 pos_train=mu(q1+1:end,:);pos_test=mu(1:q1,:); non_train=zi(q2+1:end,:);non_test=zi(1:q2,:); elseif k==N pos_train=mu(1:q1*(k-1),:);pos_test=mu(q1*(k-1)+1:end,:); non_train=zi(1:q2*(k-1),:);non_test=zi

POJ3264/RMQ

≯℡__Kan透↙ 提交于 2020-01-05 06:26:13
题目链接 /* 询问一段区间内的元素差值最大是多少,用RMQ维护一个最大值和一个最小值,相减即可。 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=50000+5; int h; int dpmax[maxn][18]; int dpmin[maxn][18]; int n,q; int k=0; int RMQ(int l,int r) { int k=0; while((1<<(k+1)<=(r-l+1))) k++; return max(dpmax[l][k],dpmax[r-(1<<k)+1][k])-min(dpmin[l][k],dpmin[r-(1<<k)+1][k]); } int main () { while(~scanf("%d%d",&n,&q)) { /* if(k) { memset(dpmax,0,sizeof(dpmax)); memset(dpmin,0,sizeof(dpmin)); } */ for(int i=0;i<n;i++) { scanf("%d",&h); dpmax[i][0]=h; dpmin[i][0]=h; } for(int k=1;(1<<k)<=n;k++) for(int i

常系数线性递推

坚强是说给别人听的谎言 提交于 2019-12-27 20:28:52
常系数齐次线性递推 给定 \(a_0,\cdots,a_{k-1},f_0,\cdots,f_{k-1}\) ,且 \(\forall i\in[k,+\infty),a_i=\sum\limits_{j=1}^kf_ja_{i-j}\) ,求 \(a_n\) 。 一眼看上去有点像分治NTT。 Part.1 设转移矩阵为 \(A\) 。 矩阵快速幂的浪费之处在于我们求出了连续 \(k\) 项,但是我们实际只关心一项。 假如说我们现在构造出了一组 \(c_0,\cdots,c_{k-1}\) ,使得 \(A^n=\sum\limits_{i=0}^{k-1}c_iA^i\) 。 那么答案 \((\mathbf fA^n)_0=\sum\limits_{i=0}^{k-1}c_i(\mathbf fA^i)_0=\sum\limits_{i=0}^{k-1}c_if_i\) 。 也就是说如果我们能够构造出一组 \(c\) ,那么我们就能够在 \(O(n)\) 的时间内求出答案。 Part.2 接下来考虑如何求出 \(c\) 。 先把 \(A^n\) 写成这样的形式: \(A^n=Q(A)G(A)+R(A)\) 。 其中 \(R(A)=\sum\limits_{i=0}^{k-1}c_iA^i\) 。 那么可以设 \(G(A)=\sum\limits_{i=0}^kg_iA^i\) 。

感受野计算公式

时光怂恿深爱的人放手 提交于 2019-12-19 01:06:59
感受野计算公式 定义 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射区域的大小。 计算公式 l k = l k − 1 + [ ( f k − 1 ) ∗ ∏ i = 1 k − 1 s i ] l_{k}= l_{k-1} + \left [ \left ( f_{k} -1 \right ) * \prod_{i=1}^{k-1} s_{i}\right ] l k ​ = l k − 1 ​ + [ ( f k ​ − 1 ) ∗ i = 1 ∏ k − 1 ​ s i ​ ] 其中$ l_{k-1} $ 为第 $ k-1 $ 层对应感受野的大小,$ f_{k} $ 为第 k k k 层的卷积核大小,或者是池化层尺寸的大小。 举个例子: 来源: CSDN 作者: 旋律_Wang 链接: https://blog.csdn.net/qq_33289694/article/details/103605244

【转】斐波那契博弈(Fibonacci Nim)

蓝咒 提交于 2019-12-16 17:39:50
有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗; 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。 约定取走最后一个石子的人为赢家,求必败态。 结论: 当n为Fibonacci数的时候,必败。 f[i]:1,2,3,5,8,13,21,34,55,89…… 用第二数学归纳法证明: 为了方便,我们将n记为f[i]。 1、当i=2时,先手只能取1颗,显然必败,结论成立。 2、假设当i<=k时,结论成立。 则当i=k+1时,f[i] = f[k]+f[k-1]。 则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。 (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k],因为f[k] < 2*f[k-1]) 对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取的石子数x的情况。 如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时x=f[k-1]-y,则x<=2/3*f[k-1]。 我们来比较一下2/3*f[k-1]与1/2*f[k]的大小。即4*f[k-1]与3*f[k]的大小,对两值作差后不难得出,后者大。 所以我们得到,x<1/2*f[k]。 即后手取完k-1堆后