摘要: 数论题。首先我们知道公式: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) 编辑