上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 18 下一页
摘要: 题意是这样的,给你一个序列a[i],需要你选一段连续的序列a[i]到a[j],使得长度乘以这个段的gcd最大。一开始总是以为是各种神奇的数据结构,诶,后来才发现,机智才是王道啊。可以这样考虑,每次我对于某一个数,保存若干个值,以i为右端点的区间且gcd为某一值的时候这个区间最大的左端点位置是哪里?但是你也许会认为这样做状态会不会有点多?更新是不是n方的呢?其实不是的,因为我们可以从左到右来递推。什么意思呢?对于每一个数,它与前面构成的gcd一定不会太多(约数肯定不会太多),所以我们最多也只需要保存每一个约数为gcd的时候左边最远能够拓展的位置。其实远远不要保存每一个约数的位置,因为实际上很多的 阅读全文
posted @ 2013-11-24 22:50 092000 阅读(655) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是求 [西伽马(p+q)]其中lcm(p,q)=n。又见数论呀。其实这个题目很简单,考虑清楚了可以很简单的方法飘过。我一开始是这样来考虑的。对于每一个单独的质因子,如果为p,它的次数为x,那么在p和q中一定有一个为p^x,另一个为p^y(0#include #include #define ll long long#define M 1000000007using namespace std;ll t,c,p[36],a[36],cas=0;ll ans;ll f1[30],f2[30],f3[30];ll power(ll x,ll y){ ll tot=1; whil... 阅读全文
posted @ 2013-11-23 23:47 092000 阅读(424) 评论(0) 推荐(0) 编辑
摘要: 题目意思很简单,给你两个串,第一个串为0,1或者?,第二个串为0,1,每次你可以对第一个串进行三种操作,1、0变为1;2、?变为0或者1;3、交换任意两个数的位置。现在问你能否把第一个串变为第一个串?最少的步数是多少呢 ??其实关键抓住一点:0可以变1,1不能变0。然后剩下的就是简单的贪心了。#include #include #include #define maxn 122using namespace std;char s1[maxn],s2[maxn];int n,m,l,t,z1,z2,o1,o2,ans,cas=0,tep;int main(){ scanf("%d&qu 阅读全文
posted @ 2013-11-23 23:39 092000 阅读(509) 评论(0) 推荐(0) 编辑
摘要: 数论题。首先我们知道公式:1^4+2^4+3^4+……+n^4=(n)*(n+1)*(2*n+1)*(3*n*n+3*n-1) /30;然后我们要把多余的减掉。这里用到的是mobius反演。总之就是加加减减就可以出答案了。#include #include #include #define ll long long#define M 1000000007using namespace std;ll power(ll x,ll y){ ll tot=1; while (y) { if (y&1) tot=(tot*x)%M; x=(x*x)%M; ... 阅读全文
posted @ 2013-11-22 17:14 092000 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 题目告诉你在一个排列中,相邻两个数的大小关系。问你排列可能有多少种情况。DP。f[i][j]表示将i个数按照前面i-1个大小关系排列且最后一个数位j的排列数有多少个。这样对于新加入的一个数i+1,我们直接枚举第i+1个数在所有的i+1个数为第几大即可。注意加入sum数组,不然时间复杂度就是O(N^3)了。注意不要每次取模,注意不需要long long。注意时间常数。#include #include #include #define maxn 1010#define M 1000000007using namespace std;int f[maxn][maxn],sum1[maxn],sum 阅读全文
posted @ 2013-11-22 17:09 092000 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 水题。直接八位八位地枚举即可。注意控制输出,注意读数的时候要把s中的全部元素置零。#include #include #include using namespace std;char s[5000];void print_digit(int x){ if (x=0; i--) print_digit(a[i]);}void output(int x){ digit_out(x); printf(": "); for (int i=x; i='A' && s[i]='a' && s[i]<='z& 阅读全文
posted @ 2013-11-22 17:05 092000 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 题意为要你从编号为1-n的所有机器中间选择出r个机器且每一个机器的编号只差不小于k-1,然后将选择的r个机器分为m组有多少种方案。其实这题目的两个步骤是相互独立的。总共的方案数等于选择的方案数乘以分组的方案数。对于选择的方案数,我们首先选出(r-1)*k+1个数,这样就保证了选择了r个合法的数。然后我们将剩下的数字填入到这r+1个空中去。这样就相当于是把剩余的那个数字分解为r+1个数字的和有多少种方案。(这里可以dp预处理了)对于分组的方案数也一样,也是预处理出来的。对于新加入的一个数,它可以放在前面的任何一个组,也可以独立为一组,这样就可以了。注意,r个数最多分为r组,所以当m>r的时 阅读全文
posted @ 2013-11-22 17:02 092000 阅读(447) 评论(0) 推荐(0) 编辑
摘要: 题目描述的意思就不说了,自己考虑的时候就是在所有的排列中,碰到大于前面最大的出现数字的时候就乘以一个二分之一,然后求和。打表后就会发现,答案分子为1*3*5*……*(2*n-1);分母为2*4*6*……*(2*n),这样就很简单了。直接保存每一个因子出现的次数,然后。。。就可以了。。。#include #include #include #define M 1000000#define maxn 1011using namespace std;struct node{ int top,s[1000]; void init() { for (int i=0; i=... 阅读全文
posted @ 2013-11-22 16:55 092000 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 题目说给你一个长串,要你选一个最长子串,不包括任何一个给定串为子串。建立一个自动机,每个点保存的信息为当前这个状态为结尾最长可以有多长?然后。。。。就可以了。。。#include #include #include #include #define maxn 1000100#define inf 99999999using namespace std;char s0[maxn];char s[105];int next[100100][26],fail[100100],tag[100100],N;int n,m,f[maxn],ans;int add(){ N++; for (in... 阅读全文
posted @ 2013-11-20 17:29 092000 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题目的意思为要你求出满足三边范围条件且周长为n的三角形的数目。其实做法是直接枚举最短边,然后就可以知道第二条边的取值范围,同时根据给定的范围缩小范围。同时根据第二条边的范围推出第三条边的范围,再次缩小范围。此时范围里面的数就是此时最短边对应的可行数。#include #include #include #define ll long longusing namespace std;ll n,m,k,x[4],y[4],ans;ll Max(ll X,ll Y) { return X>Y?X:Y; }ll Min(ll X,ll Y) { return Xtepy) continue; . 阅读全文
posted @ 2013-11-20 17:11 092000 阅读(289) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 18 下一页