ZZULIOJ 2177 排列組合

Description

平時大家都愛喫零食,但是大家知道嗎?這些零食中大多數都是垃圾食品,它對我們身體的危害是很嚴重的。
最近,趙老師在進教室時常常聞到一股怪味,覺得有同學在喫垃圾食品,老師就開始查,果然,有個同學在喫辣條。於是,趙老師在班上舉行了一次討論會,要大家就“垃圾食品危害健康”這問題發表看法。
討論會開始了,有的同學介紹了垃圾食品的危害,有的提醒我們不要去買,還有的說了垃圾食品的特點。
GJJ同學對於辣條並不感興趣。聰明的他遇到了KKK,KKK問了聰明的他一個略顯複雜的題目,雖然這個問題對於聰明的他來說問題不大,但是由於聰明的他比較懶,懶得去算,再加上昨晚修仙,今天他只想睡覺。所以,希望大家幫助KKK解決了這個問題,給你n個箱子和n個糖果,每個糖果都是獨一無二的,n個箱子有序的擺成一排,箱子編號爲1-n,每個箱子只能放一個糖果,然後要求你把n個糖果放進n個箱子中,那麼可以得到一共有多少種方案。
顯然這個方案數可以被2^M整除(M爲一個非負整數),求M最大爲多少?

Input

第一行輸入一個t(t<=1e5),表示有t組數據
每組數據輸入一個n(n爲int範圍內的正整數)

Output

輸出一個整數(int範圍內),輸出佔一行

Sample Input

21100000000

Sample Output

099999988

HINT

Source

Submit  StatusWeb   Board


思路:
方案數就是Ann(排列組合中的) ,能被2^m整除,求m,即爲求 方案數 能被2整除的個數
此題中方案數爲n的階乘,求每個數能被2整除的個數,由於奇數不能被2整除,所以算的時候可以忽略奇數
對階乘表達式一次一次求解相加 ,直接對n/2即可求出整除的個數
         例如原來n的階乘爲 10 9 8 7 6 5 4 3 2 1(省略乘號)
              第一次操作後  5 \ 4 \ 3 \ 2 \ 1 \   總數加 5
              第二次操作後  \ \ 2 \ \ \ 1 \ \ \   總數加 2
              第三次操作後  \ \ 1 \ \ \ \ \ \ \   總數加 1
              第四次操作後  \ \ \ \ \ \ \ \ \ \   總數加 0


代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		int ans=0;
		while(n){
			int num=n/2;//求n的階乘中有多少數能被2整除 
//			printf("===  %d\n",num);
			ans+=num; 
			n/=2;//對所有偶數除2,表示現在的階乘表達式還有幾個偶數 
		}
		printf("%d\n",ans);
	}
	return 0;
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章