Java & Pascal & C++——容斥原理例题——切蛋糕

23 篇文章 0 订阅
9 篇文章 0 订阅
 切蛋糕                     

  【问题描述】 

    BG 有一块细长的蛋糕,长度为?。 
    有一些人要来BG 家里吃蛋糕,BG 把蛋糕切成了若干块(整数长度),然后分给这些人。 
为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段。 
    但是,BG 并不知道要有多少人来。他只知道,来的人数为?的约数,且小于?。 
    显然把蛋糕平均分成?块一定能满足要求。但是,BG 想要分出的块数尽量少。现在BG 
想知道,他要把蛋糕分成至少多少块,才能使得不管多少人来都能满足要求。 

 【输入】 

    输入文件名为cake.in。 
    输入共一个整数?,表示蛋糕的长度。 

 【输出】 

    输出文件名为cake.out。 
    输出共一个整数,表示分出的最少块数。 

 【输入输出样例1】 

 cake.in                                cake.out 

 6                                      4 

 【输入输出样例说明】 

    4 块长度分别为2、1、1、2。 

 【输入输出样例2】 

 cake.in                                cake.out 

 15                                     7 

 【输入输出样例说明】 

    7 块长度分别为3、2、1、3、1、2、3。 

 【数据说明】 

    对于30%的数据,2≤n≤15; 
    对于50%的数据,2≤n≤1,000; 
    对于70%的数据,2≤n≤1,000,000; 

    对于100%的数据,2≤n≤1,000,000,000。

var
n,m,c,r,i : longint;
begin
        read (n);
        m:=n;
        c:=n;
        r:=trunc ( sqrt (n) );
        for i:=2 to r do
                if n mod i = 0 then begin
                        m:= (m div i) * (i-1);
                        while n mod i =0 do n:=n div i;
                end;
        if n>1 then m:= (m div n) *  (n-1);
        write (c-m);
end.

import java.util.*;
public class Main
{
public static void main(String[] args)
{
    int n,m,c;
    m=0;
    c=0;
    Scanner input = new Scanner(System.in);
    n=input.nextInt();
	m=c=n;
	for(int i=2;i*i<=n;i++)
		if(n%i==0)
		{
			m=m/i*(i-1);
			while(n%i==0) n=n/i;
		}
	if(n>1) m=m/n*(n-1);
    System.out.println(c-m);
}
}

#include<iostream>
#include<stdio.h>
#include<math.h>
int main()
{
	int n,m,r,c;
	scanf("%d",&n);
	m=c=n;
	r=sqrt(n)+1;
	for(int i=2;i<=r;++i)
		if(!(n%i))
		{
			m=m/i*(i-1);
			while(!(n%i)) n/=i;
		}
	if(n>1) m=m/n*(n-1);
	printf("%d\n",c-m);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值