k-1

【例题】64位整数乘法

筅森魡賤 提交于 2019-11-28 11:20:43
题目地址 方法一 (口胡一下就好了啊) 快速幂思想的灵活运用。 把 \(b\) 用二进制表示 , 设 \(b\) 在二进制下有 \(k\) 位 , \(c_i\) 表示 \(b\) 在二进制下的第 \(i\) 位 \[b=c_{k-1}*2^{k-1}+c_{k-2}*2^{k-2}+...+c_{0}*2^{0}\] 根据加法原理, \(a*b\) 相当于 \(b\) 个 \(a\) 相加,现在把 \(b\) 用二进制表示,那么就有: \[a*b=c_{k-1}*2^{k-1}*a+c_{k-2}*2^{k-2}*a...+c_0*2^0*a\] 根据模运算的规则,边运算边取模。 再打上类似快速幂的板子,就可以分分钟切掉这题了。这里不放代码,因为我没写。 方法二 (玄学方法) 我们知道: \[a*b \text{ mod } p = a*b-[\frac{a*b}{p}]*p\] 注:[ ]暂且看做向下取整 然后书中用了 long double 胡搞一下就过了。反正我是没看懂。 有兴趣的朋友可以写一下。 咱也不知道,咱也不敢问,咱也不想问。 来源: https://www.cnblogs.com/BaseAI/p/11406465.html

洛谷 P1472 奶牛家谱 Cow Pedigrees 题解

旧街凉风 提交于 2019-11-28 06:08:47
题面 这道题我觉得是个不错的题; 根据题意可以较清晰的发现ans只和n和k有关;(因为输入的只有这两个数啊~); 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并且用了j个节点的方案数总和; 对于一颗树,可以把它分成3部分:根节点,左字树,右子树; 对于一颗深度为i的树,左子树和右子树至少有一个达到了深度i-1; 所以转移方程是:f[i][j]+=f[i-1][k]*g[i-2][j-k-1]+f[i-1][j-k-1]*g[i-2][k]+f[i-1][k]*f[i-1][j-k-1]; g[i][j]+=g[i-1][j]+f[i-1][j]; 另外一定要注意取模的细节!!! #include <bits/stdc++.h> #define p 9901 using namespace std; int n,m; int f[1010][1010],g[1010][1010]; int main() { cin>>n>>m; f[1][1]=1; for(register int i=2;i<=m;i++){ for(register int j=1;j<=n;j+=2){ for(register int k=1;k<=j-1-k;k+=2){ int tmp=2; if(k==j-1-k) tmp=1; f[i][j]+=tmp*((f

打家劫舍

北城余情 提交于 2019-11-28 04:19:10
题目链接: 涉及知识: 动态规划 分析: 题目中的例子:2 7 9 3 1 2 7 9 3 1 拿 2 7 11 10 12 不拿 0 2 7 11 10 设 dp[k] 表示 k 个元素所能打劫的最大值。 则状态转移方程 dp[k] = max(dp[k-2] + cur,dp[k-1]) dp[k-2] + cur:表示不拿第 k-1 个元素,当前元素 + (前(k-2)个元素所能达到的最大值)。 dp[k-1] :表示 k-1 个元素所能打劫的最大值。 代码: class Solution { public int rob(int[] nums) { if(nums.length == 0){ return 0; } int take = 0, noTake = 0; int tmp = 0; for(int i = 0; i < nums.length; ++i){ tmp = noTake + nums[i]; noTake = Math.max(take, noTake); take = tmp; } return Math.max(take, noTake); } } 来源: https://www.cnblogs.com/zcxhaha/p/11392084.html

暂存(sprial)

眉间皱痕 提交于 2019-11-28 02:10:37
View Code #include " iostream " using namespace std; int main() { int n,i,j; int b[ 720 ][ 720 ]; while (cin >> n) { memset(b, 0 , sizeof (b)); if (n == 1 ) cout << n << endl; else { i = 1 ,j = 1 ; int k = 1 ; for ( int t = 1 ; t < n ; t ++ ) { while (j <= n - i + 1 && j >= i) // 横行->rigth { b[i][j] = k ++ ; if (k == n * n) break ; j ++ ; } if (k - 1 == n * n) break ; j -- ; while (i < j && i >= n - j + 1 ) // 竖行down { i ++ ; b[i][j] = k ++ ; if (k - 1 == n * n) break ; } if (k - 1 == n * n) break ; while (j > n - i + 1 ) // 横行lift { j -- ; b[i][j] = k ++ ; if (k - 1 == n * n) break ; } i -- ;

斐波那契循环节

半腔热情 提交于 2019-11-28 01:11:59
斐波那契循环节 从一道题引出一个算法: 斐波那契数列 这道题并没有什么花里胡哨的条件,就是很简单的计算 \(F(n)\ mod\ p\) 。 但是这题的 \(n\) 达到了 \(10^{30000000}\) 级别,很显然不能直接用矩阵快速幂做。 因此我们要引入一个概念:斐波那契循环节。 显而易见的是 通过看题解我们知道,斐波那契数列在模一个数时会出现循环,而这个周期的长度就称为斐波那契循环节。 所以我们只需要求出斐波那契循环节 \(m\) ,然后用矩阵快速幂计算 \(F(n\ mod\ m)\ mod\ p\) 就行了。 下面将会介绍如何计算斐波那契循环节。 (因为这只是介绍文并非论文,难免有不严谨之处,敬请谅解。本文以通俗易懂为前提,夹有较为详细的证明。) 参考自一篇全英文的paper The Period of the Fibonacci Sequence Modulo j \(Tips:\) \(1.\) 本文的数学推导具有一定难度,部分知识涉及到了高等代数和初等数论,不知道的东西可以上网查,如果实在不懂可以暂时跳过,因为这并不会影响到阅读其他部分。 \(2.\) 如果不想看证明过程,可以直接跳到第五部分看结论。 \(1.\) 前置知识 二次剩余 直接看我的另一篇博客吧。 二次剩余 域 有一个非空集合 \(G\) ,和在 \(G\) 上的一个二元运算 \(\cdot:G

基于的DCT水印算法实现

久未见 提交于 2019-11-27 23:20:57
上学期帮同校本科的同学做了毕业设计的实验部分,用MATLAB实现DCT水印算法,并且包含了攻击测试。先讲一个大体概念,然后放出具体代码。 一、DCT DCT(离散余弦变换),这里只以二维DCT为例。 信号经过DCT后,从空间域变换到频域。是一种正交变换的方法。是图像处理中应用即为广泛的傅氏变换中一种特殊的情况(被展开函数是实偶函数,再离散化,即为离散余弦变换)。 同傅氏变换一样,有正反两种变换。 正DCT:从空间域变为频域。反DCT:从频域变为空间域。具体公式如下。 正DCT: 其中: 反DCT *f(x,y)是空间采样值,简单说,就是点(x,y)的像素值。F(u,v)是频域采样值。* 二、水印算法 水印,就好像给图片盖章,注明所有权。 具体的概念不多讲,若是想深入了解,可以自行百度。 %图片加水印,提取出水印 %林多 %%% %%% %%% %%% % M = 256 ; %原图像长度 N = 32 ; %水印图像长度 K = 8 ; % 8 x8的分块 I =zeros( M , M );%创建一个 MxM 矩阵,元素全是 0 J =zeros( N , N ); BLOCK = zeros( K , K ); %显示原图像 subplot( 5 , 2 , 1 );%显示多幅图像,在第一个位置显示 I =imread( '23.bmp' );%将 23 .bmp读入 I 中

某公司运筹优化岗位第一次面试

白昼怎懂夜的黑 提交于 2019-11-27 16:49:11
P问题, NP问题, NPC问题, NP-hard问题 基本概念 复杂度级别: 1)多项式级别O(n^k);2)非多项式级别,如,指数级O(a^n)和阶乘级别O(n!)。后者的复杂度无论如何都大于前者。 归约(约化):如果能找到这样一个多项式变换法则,对任意一个程序A的输入,都能按这个法则变换为程序B的输入,使两程序的输出相同,那么我们说,问题A可归约为问题B。 通俗解释:一个问题A可以归约为问题B指,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。 特点:“问题A可归约为问题B”有一个直观意义,B的时间复杂度高于或者等于A的时间复杂度,既,问题A不比问题B难。 性质:传递性。如果问题A可以归约为问题B,问题B可以归约为问题C,则问题A一定可以归约为问题C。 P问题, NP问题, NPC问题, NP-hard问题的定义和相互关系 P问题(polynomial):求解一个问题的时间复杂度是多项式级别 NP问题(nondeterministic polynomial):可以在多项式时间里验证解是否正确的问题。定义NP问题的意义在于,如果一个问题不能在多项式时间验证,则这个问题一定没有多项式时间的算法。 图中某条路是否是Hamilton回路,可以在多项式时间验证,是NP问题图中 是否不存在Hamilton回路,不可以在多项式时间验证。 NPC问题

CodeForce Round 578 Div 2 D. White Lines

≯℡__Kan透↙ 提交于 2019-11-27 09:32:33
D. White Lines Problem Gildong has bought a famous painting software cfpaint. The working screen of cfpaint is square-shaped consisting of \(n\) rows and \(n\) columns of square cells. The rows are numbered from \(1\) to \(n\) , from top to bottom, and the columns are numbered from \(1\) to \(n\) , from left to right. The position of a cell at row \(r\) and column \(c\) is represented as \((r,c)\) . There are only two colors for the cells in cfpaint — black and white. There is a tool named eraser in cfpaint. The eraser has an integer size \(k (1 \leq k \leq n)\) . To use the eraser, Gildong

CodeForces 1200D White Lines

一笑奈何 提交于 2019-11-27 08:43:56
cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single row that contains at least one black cell. If the first appearance of a black cell is at the l l -th column and the last appearance of a black cell is at the r r -th column, we can determine whether it becomes a white line when a certain cell ( i , j ) ( i , j ) is clicked in O ( 1 ) O ( 1 ) , after some preprocessing. It becomes a white line if and only if a cell ( i , j ) ( i , j ) is clicked where the row is at [ i , i + k − 1 ] [ i , i + k − 1 ] and j ≤ l ≤ r ≤ j + k − 1 j ≤ l ≤ r ≤ j + k −

ST表(RMQ) 总结

陌路散爱 提交于 2019-11-26 19:18:13
f[i][j] 表示 以i号点为起点 的长度为 2^j 次方 终点为i+2^j-1 的最大或者最小值 打表时间复杂度 O(Nlog2(N)) 查询O(1) 打表代码: for(int i=1;i<=n;i++) { scanf("%d",&f[i][0]); } for(int j=1;j<=log2(n);j++) { for(int i=1;i+(1<<j)-1<=n;i++) { f[i][j]=max(f[i][(j-1)],f[i+(1<<j-1)][j-1]); } } 将区间分为两段 [i ,i+2^(j-1)-1 ] 和[2^(j-1)+i,i+2^j-1] 查询代码: scanf("%d%d",&l,&r); int k=log2(r-l+1); printf("%d\n",max(f[l][k],f[r-(1<<k)+1][k])); k 为区间长度的log 2 值 查询 l到l+2^k-1 和r-(2^k)+1 到 r 关于二维 RMQ 查询一个矩阵里面的最大最小值 例题 POJ https://vjudge.net/problem/POJ-2019 code: // #include<iostream> #include<cstdio> #include<cmath> using namespace std; int f1[260][260][40],f2