- 【阿里笔试题目】:给定一个数n,然后从1到n的这n个数构成一个环,每次从这个环中抽取m(1<=m<=n)个连续的数,问总共有多少种不同抽取方案
- 【case1思想暴力解法】:先统计正序的组合数,再求反序的组合数
- 比如:n = 4
- 正序的组合有:
- {1},{1,2},{1,2,3},{1,2,3,4} :n种
- {2},{2,3},{2,3,4} :n-1种
- {3},{3,4} :n-2种
- {4} :1种
- 正序组合的数的个数 = n+(n-1)+(n-2)+…+1
- 反序组合的数的个数怎么求呢?
- 还是找规律,从最后一个数n看起
- 以4开头的反序组合有 n-2 = 2种:{4,1} {4,1,2}
- 以3开头的反序组合有 1种 (前面的反序组合数-1):{3,1}
- 以2之后的数字开头的反序的组合都是0种
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextInt();
long res =0,counts = n;
for(long i=1;i<=n;i++){
res+=counts;
counts--;
}
counts = n-2;
for(long j=n;j>=1;j--){
res+=counts;
counts--;
if(counts<=0){
break;
}
}
System.out.println(res);
}
}
case2:【思想】:n个数构成圆环,然后每次从其中抽取m(1<=m<=n)个数,则先考察m=1时,有n种抽取方案,m=2时也是n种抽取方案,…一直到m=n-1时都是n种抽取方案,只有m=n时只有1种方案,则总共的组合数 = n*(n-1)+1
import java.util.Scanner;
public class T1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextInt();
System.out.println(n*(n-1)+1);
}
}