POJ1850 Code 【排列组合】

还不算是难题(嘿嘿,因为我做出来了)

很简单,找到相应的方程式解就是了(中间也犯了一个很2的错误,把9+10+11+...+99写成(1+90)*90/2,改过来后就好了)

不多说,code is below

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int combi(int a,int b)
{
	int sum=1;
	int j=1;
	for(int i=a;i>=a-b+1;i--)
	{
		sum*=i;
		while(j<=b&&sum%j==0)
		{
			sum/=j;
			j++;
		}
	}
	return sum;
}
int main()
{
	#ifndef ONLINE_JUDGE
		freopen("/home/test/samplein","r",stdin);
		freopen("/home/test/sampleout","w",stdout);
	#endif
	char words[1111];
	scanf("%s",words);
	int len=strlen(words);
	for(int i=0;i<len-1;i++)
	{
		if(words[i]>=words[i+1])
		{
			printf("0\n");
			return 0;
		}
	}
	int sum=0;
	for(int i=1;i<len;i++)
	{
		sum+=combi(26,i);
	}
	for(int i=0;i<len;i++)
	{
        int j;
        if(i==0)
            j='a';
        else
            j=words[i-1]+1;
		for(;j<words[i];j++)
		{
			sum+=combi('z'-j,len-i-1);
		}
	}
	printf("%d\n",sum+1);
	return 0;
}

POJ1850 Code 【排列组合】

时间: 2024-12-23 07:49:40

POJ1850 Code 【排列组合】的相关文章

POJ1850 Code(组合+康托展开)

题目问一个合法字符串的字典序是第几个,合法的字符串是指里面的字符严格递增. 先判断合不合法,然后用类似康托展开的过程去求.大概过程就是用组合数算出某长度某前缀有几个,累加起来. 真难一遍写对.. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 bool islegal(char *s){ 5 for(int i=1; s[i]; ++i){ 6 if(s[i]<=s[i-1]) return 0;

poj1850(Code)

题目地址:Code 题目大意: 按照字典序的顺序从小写字母a开始按顺序给出序列 a - 1     b - 2     ...     z - 26     ab - 27     ...     az - 51     bc - 52     ...     vwxyz - 83681     ... 输入字符串由小写字母a-z组成字符串为升序,根据字符串输出在字典里的序列号为多少. 解题思路: 排列组合,记住公式: 先看字符的长度一个字符的时候是26为C(26,1),两个字符的时候分别从以a

UVALive 6469 Deranged Exams (排列组合:绝逼是纯纯的高中知识啊)

题目意思是 : 给你一个n([1,17])表示有n个数据结构里的术语,然后n个对这些术语的定义,让你对这些术语和定义对号入座(相当于进行连线,A术语连A术语的定义).然后一个 k([0,n]),问你至少前k个术语定义对应错的总共有多少种. 起先我也不怎么会,忘完了,后来看别人的题解,可能我语文真的不怎么好,不是很能理解,然后问的别人...然后xxx给我说我有写个题解的必要了 so... 就是高中排列组合,至少前k个连错的方案总共有多少种,因为如果直接按照题意来,一般都很麻烦,所有就反正来,用[总

输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)

输入N个数,输出所有可能的排列组合 一行代码一行泪...手都被发热的笔记本烤的不舒服了....6个多小时过去鸟...终于粗来鸟.... 昨天同学问到一个排列组合的问题,本身不会很难,原题是固定输入4个数字,例如1 2 3 4,输出所有可能的排列组合 暴力的话应该不难的.代码+debug,半个小时. 如果是输入N个数字呢? 先说简单的暴力方法,如果输入4个数字,输出所有的排列组合 代码比较短,也比较简单,没有很刻意的去把代码的风格写的好一点,所以数字常量什么的表介意.... /**********

leetcode-Combinations 复习复习排列组合

Combinations 题意: 根据给定的n和k,生成从1到n范围内长度为k的排列组合 示例: n=4 k=2 [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]] 解题: 正常情况下我们通常想到的都是通过使用递归,以枚举的形式来生成组合.先从给定的范围中拿一个数出来,把它同剩下的每一个数进行组合,然后再在每个组合上对不存在于组合的每个数进行合并,这样依次

js 排列 组合 的一个简单例子

最近工作项目需要用到js排列组合,于是就写了一个简单的demo. 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了, 排列的实现方式: 全排列主要用到的是递归和数组的插入 比如12的全排列,首先把1拿出来放到elementCur,再获取由1组成的数组[2],然后在循环把1插入到0,1的位置后再返回1,2][2,1] 如果是123那么首先获取23的全排列[2,3][3,2],然后在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1]

HDU 4497 GCD and LCM(分解质因子+排列组合)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满足要求的(x, y, z)有多少组,并且要考虑顺序. 思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在.具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/

自然语言处理(NLP) - 数学基础(1) - 排列组合

正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先开始最为大家熟知和最基础的知识点吧, 排列组合. 虽然排列组合这个知识点大家是相当地熟知, 也是相当地基础, 但是却是十分十分十分地重要. NLP届掌门人斯坦福大学的Daniel Jurafsky(D. 朱夫斯凯)和科罗拉多大学James H. Martin(J. H. 马丁)在其NLP巨作<自然语言处

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最