Acdream1084 寒假安排 求n!中v因子个数

题目链接:点击打开链接

寒假安排

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others)

SubmitStatistic Next
Problem

Problem Description

寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行。

假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫数量太过庞大了,而寒假的天数太少,所以lzx在寒假里不会与一个MM约会一次以上。现在lzx想要知道:寒假安排的方案数如果写成k进制,末位会有多少个0。

Input

输入的第一行是一个整数,为数据的组数t(t<=1000)。

每组数据占一行,为3个正整数n、m和k(1<=m<=n<2^31,2<=k<2^31),意思如上文所述。

Output

对于每组数据,输出一个数,为寒假安排的方案数写成k进制末位的0的数目。

Sample Input

3
10 5 10
10 1 2
10 2 8

Sample Output

1
1
0

Source

Dshawn

Manager

admin

求n!中v因子个数的做法:

代码:

ll go(ll x, ll v){
	ll ans = 0;
	ll tmp = v;
	while(x>=tmp){
		ans += x/tmp;
		tmp*=v;
	}
	return ans;
}

然后把k分解质因素。取因子中最小的数量既是0的个数。

#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<ctype.h>
#include<cstring>
#include<math.h>
#include<set>
#include<queue>
using namespace std;
#define ll long long
ll n, m, k;
ll Stack[1000], top, Cnt[1000];
void fenjie(){
	top = 0;
	memset(Cnt, 0, sizeof Cnt);
	for(ll i = 2; i*i<=k; i++)if(k%i==0){
		while(k%i==0)Cnt[top]++, k/=i;
		Stack[top++] = i;
	}
	if(k>1){
		Cnt[top]++;
		Stack[top++] = k;
	}
}
ll go(ll x, ll v){
	ll ans = 0;
	ll tmp = v;
	while(x>=tmp){
		ans += x/tmp;
		tmp*=v;
	}
	return ans;
}
ll tmp[1000];
int main(){
	int T;scanf("%d",&T);
	while(T--){
		cin>>n>>m>>k;
		fenjie();
		memset(tmp, 0, sizeof tmp);
		for(ll i = 0; i < top; i++){
			tmp[i] += go(n, Stack[i]);
		}
		for(ll i = 0; i < top; i++){
			tmp[i] -= go(n-m, Stack[i]);
		}
		ll ans = tmp[0]/Cnt[0];
		for(ll i = 1; i < top; i++)
			ans = min(ans, tmp[i]/Cnt[i]);
		cout<<ans<<endl;
	}
	return 0;
}

Acdream1084 寒假安排 求n!中v因子个数,布布扣,bubuko.com

时间: 2024-08-11 01:35:45

Acdream1084 寒假安排 求n!中v因子个数的相关文章

编程之美-02数字之魅-求二进制数中1的个数

题目:求二进制数中 1 的个数 对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 解法一:移位->判断->累计 解法二:除2->判断->累计 解法三:v &= (v -1)需要掌握 ? 2 3 4 5 6 7 8 int num = 0; while(v) {     v &= (v -1);     num++; } return num; ? 2   解法四:分支操作(swicth-cas

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),

算法题:求二进制位中0的个数

#include <iostream> using namespace std; //古有求二进制数中1的个数,今有求二进制中0的个数. int Grial(int x) { int count = 0; while (x + 1) { count++; x |= (x + 1); } return count; } int main() { cout << Grial(1) << endl; return 0; } //为了方便验证,我把求二进制数中1的个数也写下来.

求二进制数中1的个数——引发的问题

<编程之美>书中有这样的一道问题“求二进制数中1的个数” 题目:对于一个字节(8bit)的无符号整形变量,求其二进制中“1”的个数,要求算法的执行效率尽可能高. 我使用java语言处理:输出结果是3 public class Count { public static int Count(byte d){ int num = 0; while (d != 0) { d &= (d-1);//比较1的个数 num++; } return num; } public static void

51nod_1003 阶乘后面0的数量(求N!中5的个数,数论)

题意: n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) OutPut 输出0的数量 思路: 一个0只能由2*5得到.统计N!中2的个数和5的个数,取少的.即求N!中5的个数.[数论:[N/5]+[N/5^2]+[N/5^3]+[N/5^4]+....]{也自己分析也可以得出此结论} 代码: int main(){ int n; cin >> n; ll ans=0; ll tmp

【位运算】求二进制数中1的个数

1 import java.util.Scanner; 2 3 /** 4 * 功能:位运算,求二进制数中1的个数 5 * 思路:通过每次右移一位,并与1进行与运算,判断该位是否是1,最后统计个数. 6 */ 7 public class Main4 { 8 9 public int count(int num) { 10 11 if (num <= 0) { 12 return 0; 13 } 14 15 int count = 0; 16 17 while (num > 0) { 18 i

编程之美----求二进制数中1的个数

学到的知识点:将一个数和它本身减一作与运算,如果结果为0,说明这个数表示成二进制数时里面有且仅有一个1.于是乎,下面这段代码可以用来求一个数中1的个数. 1 int Count(BYTE v) 2 { 3 int num=0; 4 while(v) 5 { 6 v &= (v-1); 7 num++; 8 } 9 return num; 10 } 另外,如果要求的数位数比较小,可以用hash表来做个预处理,这样可以用o(1)的时间求解.

【编程之美学习笔记】2.1求二进制数中1的个数

问题:对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高. 解法一:除.余操作 我们知道,对于二进制操作,除以一个2,原来的数字将会减少一个0,如果除的过程中有余,那么就表示当前位置有一个1,所以可通过相除和判断余数的值来分析. [时间复杂度O(log2v),log2v为二进制数的位数,空间复杂度O(1)] 1 int Count(int v){ 2 int num = 0; 3 while(v){ 4 if(v % 2 == 1) num++;