Java & Pascal & C++——容斥原理例题——切蛋糕
2017-07-07 15:20
781 查看
切蛋糕
【问题描述】
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.
#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;
}
【问题描述】
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;
}
相关文章推荐
- C++ & Pascal & Java ——NOIP2016提高组day2 t1——组合数问题
- C++&Pascal&Java——NOIP2015提高组day1 t1——神奇的幻方
- USB口异常与C++&Java
- c++ --> java
- (字符串处理)java & C++(POJ3157)
- MFC之工厂模式(C++ & java)
- OOP编程比较学习__C++ & JAVA (一)定义类和创建对象
- Difference between Java & C++
- 关于C++&Java中命令行编译的问题
- 关于C++&Java中命令行编译的问题
- C++中多态要注意的事情&与Java的对比
- OOP语言技术比较:Java,C++,Object Pascal
- USB口异常与C++&Java
- USB口异常与C++&Java
- USB口异常与C++&Java
- Basic of JAVA & C++ Compare
- GNU/Linux Debian + MySQL 5.0+ Java + "C++" + Eclipse 的N种可能
- USB口异常与C++&Java
- C++ & JAVA
- 指针&引用在C C++ JAVA 语言特性导致表达能力的差异