CSDN 高校俱乐部/英雄会 题目;

设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k ?

输入包含5个参数:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N

单全排列超时代码:

#include <stdio.h>
#include <string.h>
int b[5];
int c[5];
int a[15];
int aa[15];
int vis[15];
int n, sum, k; int B_same_num(int b[]){
int i, j;
int p = 4;
for(i=0;i<3;++i){
if(b[i] == -1) continue;
for(j=i+1;j<4;++j)
if(b[i] == b[j]){
b[j] = -1;
--p;
}
}
return p;
} void reset(int b[]){
int i, j;
for(i=j=0; j < 4; ++j){
if(b[j] != -1)
c[i++] = b[j];
}
} void dfs(int s, int num) {
int i;
if(s == n) {
if(4 == num)
if( (c[0]*a[a[0]] + c[1]*a[a[1]] + c[2]*a[a[2]] + c[3]*a[a[3]])%n == k )
++sum;
if(3 == num)
if( (c[0]*a[0] + c[1]*a[1] + 2 * c[2]*a[2])%n == k )
++sum;
if(2 == num)
if( (c[0]*a[0] + 3 * c[1]*a[1])%n == k )
++sum;
if(1 == num)
if( (4 * c[0]*a[0])%n == k )
++sum; return;
}
for(i = 0; i < n; i++) {
if(vis[i]) continue;
vis[i] = 1;
a[s] = i;
dfs(s+1, num);
vis[i] = 0;
}
} int main(int argc, char const *argv[])
{
int t, i;
scanf("%d", &t);
while(t--){
sum = 0;
scanf("%d %d", &n, &k);
for(i=0;i<4;++i)
scanf("%d", &b[i]);
int num = B_same_num(b);
reset(b);
dfs(0, num);
printf("%d\n", sum);
}
return 0;
}

  

双全排列改进后AC的代码:

#include <stdio.h>
#include <string.h>
int b[5];
int c[5];
int a[15];
int d[15];
int sui[15];
int vis[15];
int vis1[15];
int arr[15];
int jiecheng[20];
int n, sum, k; void _jiecheng(){
jiecheng[0] =1;
jiecheng[1] =1;
jiecheng[2] =2;
jiecheng[3] =6;
jiecheng[4] =24;
jiecheng[5] =120;
jiecheng[6] =720;
jiecheng[7] =5040;
jiecheng[8] =40320;
jiecheng[9] =362880;
jiecheng[10] =3628800;
jiecheng[11] =39916800;
jiecheng[12] =479001600;
} void init(){
int i;
for(i=0;i<15;++i) arr[i] = 0;
} int B_same_num(int b[]){
int i, j;
int p = 4;
for(i=0;i<3;++i){
if(b[i] == -1) continue;
for(j=i+1;j<4;++j)
if(b[i] == b[j]){
b[j] = -1;
--p;
}
}
return p;
} void reset(int b[]){
int i, j;
for(i=j=0; j < 4; ++j){
if(b[j] != -1)
c[i++] = b[j];
}
} void suiji(int s, int num, int b_num) {
int i, j;
int dd;
dd = n - num - b_num; if(s == num) {
j=0;
for(i = 0; i < b_num; i++){
if(arr[a[c[i]]] == 1) continue;
else {
a[a[c[i]]] = sui[j++];
}
}
if(4 == b_num){
if( (c[0]*a[a[c[0]]] + c[1]*a[a[c[1]]] + c[2]*a[a[c[2]]] + c[3]*a[a[c[3]]])%n == k ){
sum+=jiecheng[dd];
}
}
if(3 == b_num)
if( (c[0]*a[a[c[0]]] + c[1]*a[a[c[1]]] + 2 * c[2]*a[a[c[2]]])%n == k )
sum+=jiecheng[dd];
if(2 == b_num)
if( (c[0]*a[a[c[0]]] + 3 * c[1]*a[a[c[1]]])%n == k )
sum+=jiecheng[dd];
if(1 == b_num)
if( (4 * c[0]*a[a[c[0]]])%n == k )
sum+=jiecheng[dd];
return;
}
for(i = 0; i < n; i++) {
if(vis1[i]) continue;
if(vis[i]) continue;
vis1[i] = 1;
sui[s] = i;
// printf("sui : %d\n", sui[s]);
suiji(s+1, num, b_num);
vis1[i] = 0;
}
} int arr_num(int num){
int dd = 0;
int i;
for(i=0;i<num;++i)
if(arr[a[c[i]]] == 1) continue;
else ++dd;
return dd;
} void dfs(int s, int num) {
int i, t;
if(s == num) {
init();
for(i=0;i<num;++i){
a[c[i]] = d[i];
arr[c[i]] = 1;
}
t = arr_num(num);
suiji(0, t, num);
return;
}
for(i = 0; i < n; i++) {
if(vis[i]) continue;
vis[i] = 1;
d[s] = i;
dfs(s+1, num);
vis[i] = 0;
}
} int main(int argc, char const *argv[])
{
int t, i;
scanf("%d", &t);
while(t--){
sum = 0;
_jiecheng();
scanf("%d %d", &n, &k);
for(i=0;i<4;++i)
scanf("%d", &b[i]);
int num = B_same_num(b);
reset(b);
dfs(0, num);
printf("%d\n", sum);
}
return 0;
}

  

精简版 代码:

#include <stdio.h>
#include <string.h> int a[12];
int b[4];
int N, K, ans;
int v[12];
int fac[14]; void factorial(){
int i;
fac[0] = 1;
for(i=1;i<=12;++i)
fac[i] = fac[i-1]*i;
} void dfs2(int s){
int t;
if(s == 4){
if ((a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%N==K){
t = 0;
int i;
for(i=0;i<N;++i)
if(a[i] == -1) ++t;
ans += fac[t];
}
return;
}
if(a[a[b[s]]] != -1)
dfs2(s+1);
else{
int i;
for(i=0;i<N;++i)
if(!v[i]){
v[i] = 1;
a[a[b[s]]] = i;
dfs2(s+1);
v[i] = 0;
a[a[b[s]]] = -1;
}
}
} void dfs(int s){
int i;
if(s == 4){
dfs2(0);
return;
}
if(a[b[s]] != -1)
dfs(s+1);
else{
for(i=0;i<N;++i)
if(!v[i]){
v[i] = 1;
a[b[s]] = i;
dfs(s+1);
v[i] = 0;
a[b[s]] = -1;
}
}
} int main(int argc, char const *argv[])
{
int i;
scanf("%d%d%d%d%d%d", &N, &K, &b[0], &b[1], &b[2], &b[3]);
ans = 0;
memset(v, 0, sizeof(v));
for(i=0;i<12;++i) a[i] = -1;
factorial();
dfs(0);
printf("%d\n", ans);
return 0;
}

  

  

测试数据 :

#include <stdio.h>
#include <string.h> int howmany (int N,int K,int B0,int B1,int B2,int B3)
{
if(N==4 && K==0 && B0==3 && B1==2 &&B2==1 &&B3==0) return 4;
if(N==5 && K==2 && B0==1 && B1==2 &&B2==3 &&B3==4) return 40;
if(N==6 && K==4 && B0==5 && B1==4 &&B2==3 &&B3==2) return 78;
if(N==7 && K==6 && B0==6 && B1==4 &&B2==2 &&B3==0) return 684;
if(N==8 && K==1 && B0==0 && B1==1 &&B2==2 &&B3==3) return 5454;
if(N==9 && K==3 && B0==4 && B1==8 &&B2==1 &&B3==2) return 44028;
if(N==10 && K==5 && B0==3 && B1==7 &&B2==9 &&B3==0) return 349776;
if(N==11 && K==7 && B0==3 && B1==1 &&B2==8 &&B3==9) return 3651984;
if(N==11 && K==0 && B0==0 && B1==0 &&B2==0 &&B3==0) return 39916800;
if(N==11 && K==5 && B0==4 && B1==3 &&B2==2 &&B3==1) return 3662976;
return 0;
}

  

PS :  和别人的代码根本无法媲美。。以后在重新改进一下这份代码!

CSDN 高校俱乐部: 排列搜索的更多相关文章

  1. CSDN高校俱乐部2013年秋季北京地区第一站“编程语言的应用及其发展”—北京联合大学

    2013年12月11日晚17:00.CSDN高校俱乐2013年秋季北京地区第一站“编程语言的应用及其发展”在北京联合大学进行. 首先,CSDN总部人员介绍CSDN俱乐部的改版以及线上编程挑战赛.CSD ...

  2. 朋友的礼物(英雄会,csdn,高校俱乐部)信封问题,匹配模型

    前言: 首先这是一题解,但是重点最代码之后,有耐心的可以直接从代码后看. 上题目:n个人,每个人都有一件礼物想送给他人,他们决定把礼物混在一起,然后每个人随机拿走一件,问恰好有m个人拿到的礼物恰好是自 ...

  3. P次方数 英雄会 csdn 高校俱乐部

    题目: 一个整数N,|N| >= 2, 如果存在整数x,使得N = x * x * x... (p个x相乘) =x^p,则称N是p次方数,给定32位内的整数N,求最大的P.例如N=5,输出1,N ...

  4. (csdn高校俱乐部编程挑战)2的补码

    题目详情 在计算机中,整数是以2的补码的形式给出的. 给出整数A和B,如果计算机是32位机.求从A到B之间的全部二进制数中,一共用了多少个1. 输入格式: 多组数据,每组数据一行,由两个整数A,B, ...

  5. CSDN高校俱乐部第二届战神杯第二题题解

    两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍.要保证结果非负, 首先得到0的人获胜. 比如:30 8经过一步操作能够变为22 8 或者14 8 或者 6 8. ...

  6. N的N次方(高校俱乐部)

    最近一直在刷字符串和线段树,也越来越少玩高校俱乐部,无聊看到一题N的N次方的问题,脑海中各种打表就涌现出来了. 弄了不一会儿,就写完了,马上提交,但是系统好像出了问题,提示"哦哦,出了点状况 ...

  7. CSDN的博客搜索功能不又给力了呵呵呵呵

    不得不说,CSDN博客的搜索功能是在太弱了.而且一直都很弱,以至于我每次想在自己博客上找自己发的文章都变得那么难.做一个搜索博客内文章的功能没有那么难吧? 还是说CSDN已经放弃了博客这一块了? 我发 ...

  8. 翻纸牌 高校俱乐部 英雄会 csdn

    题目描述 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者 ...

  9. 半质数的个数 csdn 英雄会 高校俱乐部

    2·14 情人&元宵节专题:半质数的个数. 题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数.前几个半质数是 4, 6, 9, ...

随机推荐

  1. Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS

    进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...

  2. iOS,Android,.NET通用AES加密算法

    原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果 ...

  3. 开始折腾cocos2d-x,使用批处理来创建项目

    开始服用的时间来学习cocos2d-x该,尽管C和C++另外不咋.只是学习和记忆可能是更深层次的,现在发展: so从今天开始正式决定学会与自己的业余时间折腾吧,仅这51什么.昨天,在开发环境中建,Vi ...

  4. jQuery.extend()方法和jQuery.fn.extend()方法

    jQuery.extend()方法和jQuery.fn.extend()方法源码分析 这两个方法用的是相同的代码,一个用于给jQuery对象或者普通对象合并属性和方法一个是针对jQuery对象的实例, ...

  5. [转]JS中的prototype

    JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

  6. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  7. 多维算法思考(三):AB组合问题

    多维算法思考(三):AB组合问题 题目:x个A,y个B可以组合成多少个不同排列的问题. 首先,我们用数学的方式思考,这个问题属于<组合数学>的问题,我们的第一种方法可以用组合思路来求解. ...

  8. hardware_hp刀片服务器安装windows 2008系统配置

    2012年10月26日星期五 第一步. 看刀片机柜的后的OA地址 点击 OK 查看 Actlve OA 例如: 192.168.254.31 l 第二步: 连接PC 到左侧第一个接口 修改本机ip为同 ...

  9. C#操作Excel初探

        近期一段时间正好在做winform导出Excel报表的问题,学习了一下C#操作Excel的一些方法(如:向Excel中插入图片:删除Excel指定sheet中的某行或某列,在Excel指定的单 ...

  10. 【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值

    问题 java中,怎样推断数组Array是否包括指定的值 精华回答 1. Arrays.asList(...).contains(...) 2. 使用 Apache Commons Lang包中的Ar ...