摘要:给定一个整数n,要找出n能拆分成多少种不同的若干个数的和与乘积的形式。比如: 4=4 12=1*12 4=1+3 12=2*6 4=2+2 12=3*4 4=1+1+2 12=2*2*3 4=1+1+1+1 先看加法形式,可以构造一个母函数F(x)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^n)...(1+x^n),将这个母函数展开后,求出每一个x^k前面的系数Ck,就是对应的整数K有多少种拆分的形式。#include <iostream> using namespace std; const int MAXN = 120; int c1[MAXN+1],
阅读全文
05 2011 档案
摘要:这两种办法在文章部分已经都有提及,基本思想都是大数相加,一种是字符串相加,一种是数组保存位数第一种,字符串相加直接用一个字符串相加函数,计算结果保存到字符串数组中View Code 1 string operator +(const string s1,const string s2) 2 { 3 string s; 4 int l1=s1.size(),l2=s2.size(),i,j; 5 int a[1100]={0},k=0; 6 for(i=l1-1,j=l2-1;i>=0||j>=0;i--,j--,k++) 7 { 8 if(i>=0) 9 a[k]+=(s1[
阅读全文
摘要:此类问题一般常用的有两种算法,时间复杂度分别是O(n^2)和O(nlogn)第一种,普通算法,用一个标记数组标记包括当前数的最长序列的长度,然后往前递归寻找,此类方法这里不多说了文章的dp问题里已经用过多次了下面着重介绍一下一种省时但是不常用的算法,整体思想是DP+二分搜索,用一个b[k]=m 来标记k长度的最长序列下,最小的数是m,比如有一序列 5 3 7 4首先b[1]=5,初始化长度为1的序列就是第一个数,接下来到3的时候,3独立的长度为1的序列小于5,所以b[1]=3,那么b[2]=4 因为长度为2的序列有两个5-7,3-7,3-4,期中序列最大的数最小的就是4了因此,寻找大于当前数的
阅读全文
摘要:字符串搜索标记可以用异或来处理。这样避免了大批字符串超时等等的可能hoj1361题,给出的是输入n个(n灰常大)字符串,然后再输入n-1个,问另外一个没输入的是什么??如果一个一个搜索去标记太麻烦了,字符串hash也过于繁琐,在这里字符串异或就起作用了把每个字符串的各个位都取异或,那么最后的结果就是没有输入的那个了1 memset(s2,'\0',sizeof(s2)); 2 while(1){3 scanf("%s",s1);4 for(int i=0;i<strlen(s1);i++)5 s2[i]^=s1[i];6 } 7 printf(&quo
阅读全文
摘要:斯特林[striling]公式(求阶乘(n!)的位数) 2007-10-05 13:49/*例如1000阶乘位数: log10(1)+log10(2)+···+log10(1000)取整后加1 */#include<stdio.h>#include<math.h>int main(){int n,i,t;double d;scanf("%d",&t);while(t--){while(scanf("%d",&n)){ d=0; for(i=1;i<=n;i++) d+=log10
阅读全文

浙公网安备 33010602011771号