Java & Pascal & C++——容斥原理例題——切蛋糕
阿新 • • 發佈:2019-01-02
切蛋糕
【問題描述】
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;
【問題描述】
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;
}