【Henu ACM Round #13 F】Fibonacci-ish】的更多相关文章

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是不是存在就好了. 但是这样复杂度看起来是O(N^3)的了. 其实不然,a[n] = a[n-1]+a[n-2]这个递推的增长速度是接近2^n的增长速度的. (所以到达10^9之后直接break就好了 所以实际上不会真的达到递推1000的规模 差不多只有O(N^2*100)的样子. 这是可以接受的了.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中的前 i+1-f[i]个字符组成的 字符串. 特殊的,t可能就是一个空串. 比如abcdefg 这里f是kmp算法中的f数组 然后t有两种可能 ① t==s 这样的话,整个前缀就是 sssssss..ss了 这里有(i)/(i-f[i])个s 设为num; 我们可以用这些s来构造ababababa的形式. 则…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1.那么除过之后没有影响的. 然后.就是要明白 那个f(x)函数的意义.其实就是问你x质因数分解之后,其中好的质数和坏的质数的差是多少. 也即有多少个好因数,多少个坏因数. (以下的gcd(i)都指的是a[1..i]这些数字的gcd 然后考虑我们在第i个位置进行了一次操作. 显然他会对后面的数字造成影响…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3+a4+...+ak+2 ->a2<ak+2 类似还可以推出 a3<ak+3 a4<ak+4 ... 则有 a1<ak+1<a2k+1<a3k+1... a2<ak+2<a2k+2<a3k+2... ... 也就是每隔k个要是递增的. 你的任务就是维…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其他角都是空的正方形. 举一些例子. ...* *... 可以看到这个连通块不是长方形. 就是因为有 .. *. 和 .* .. 如果我们把这两个角上的墙给删掉的话. 显然就能得到一个矩形了. 根据这个作为启发. 我们可以将整张图里面所有的2x2的正方形里面的"角"都给删掉. 这样的话,就能…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. 如果这个位置能放右括号和第一个匹配(位置满足在1+l[i]..1+r[i]之间. 那么我们就在第二个位置放一个右括号就好了. (如果我们作死不放右括号的话,那就只能放左括号了->一定要放一个括号的 那么我们就只能先匹配这一个左括号了,而前一个左括号可能在第3个位置就不能匹配了. 这就会造成错解. 也…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和b[i]相同了. (其他点无论怎么按b[i]只会变大) 但是这样直接暴力写会超时->O(N^2). 则写一个队列. 处理和他相邻的点的时候. 如果发现a[y]==b[y] 就重新入队. 因为可以保证每个点最多操作一次. 所以复杂度就是O(n+m)的了. [代码] #include <bits/st…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到任意点的最短路以及最短路条数=>dis[1][i],cnt[1][i] dis数组的初值为-1,表示无穷大 设起点到终点的最短路为mini 起点到终点的最短路条数为minicnt 对于每一条边(x,y,z) 如果dis[0][x]==-1 || dis[1][y]==-1代表x或者y不能到达起点或终点…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对m个串建立一棵字典树. 然后对主串. 尝试从第一个位置开始.在字典树中尝试匹配 如果匹配到了位置i 就再从位置i+1开始尝试匹配 (这时又重新从根节点开始重新匹配 每次匹配最多只要往下走50步. 写个递归的过程就好. [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e6; const int NN = 1e4; const int M = 1…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 123...n中末尾0的个数 只会由素因子2和5的个数决定且等于 Min{cnt[2],cnt[5]} 且素因子2的个数一定会比5多; 所以n!的末尾0的个数 等于for (int i = 1;i <= n;i++)中所有i的5因子的个数和 枚举一下就好 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e7; int n; vector&…