1. 程式人生 > >Java & Pascal & C++——容斥原理例題——切蛋糕

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

 切蛋糕                     
 【問題描述】 

    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;
}