วิธีเขียน N เป็นผลิตภัณฑ์ของจำนวนเต็ม M มีกี่วิธี


12

รับจำนวนเต็มN , นับจำนวนวิธีที่สามารถแสดงเป็นผลคูณของMจำนวนเต็ม> 1

อินพุตเป็นเพียงNและMและเอาต์พุตคือจำนวนรวมของกลุ่มจำนวนเต็มที่แตกต่างกัน ความหมายคุณสามารถใช้จำนวนเต็มมากกว่าหนึ่งครั้ง แต่แต่ละกลุ่มจะต้องแตกต่างกัน ( 3 x 2 x 2จะไม่นับถ้า2 x 2 x 3มี)

ข้อ จำกัด

1 < N <2 31
1 < M <30

ตัวอย่าง

อินพุต30 2ให้เอาต์พุต3เนื่องจากสามารถแสดงได้ 3 วิธี:

2 x 15
3 x 10
5 x 6

อินพุต16 3ให้เอาต์พุต1เนื่องจากมีเพียงกลุ่มเดียวเท่านั้น:

2 x 2 x 4

อินพุต2310 4ให้เอาต์พุต10:

5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77

อินพุต15 4ให้เอาต์พุต0เนื่องจากไม่สามารถทำได้

กฎระเบียบ

ใช้ช่องโหว่รหัสกอล์ฟมาตรฐานพร้อมกับคำจำกัดความมาตรฐานสำหรับอินพุต / เอาต์พุต รู้รอบอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ ไม่อนุญาตให้ใช้ฟังก์ชันในตัวสำหรับการแยกตัวประกอบและ / หรือการแบ่งพาร์ติชัน แต่ฟังก์ชันอื่น ๆ ใช้งานได้ดี รหัสนับเป็นไบต์


คุณหมายถึงอะไรโดยการแบ่งพาร์ติชัน?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer การจัดกลุ่มรายการเป็นรายการย่อยที่ไม่ทับซ้อน บางภาษามีนี้สร้างขึ้นในเช่นMathematica
Geobits

มีการ จำกัด เวลาหรือไม่? อัลกอริทึมไร้เดียงสาโดยเฉพาะอาจใช้เวลาหลายศตวรรษในการสร้างค่าเอ็มจำนวนมากสิ่งที่เรียบง่ายเช่นการสังเกตว่ามีเพียงปัจจัยเดียวที่มีขนาดใหญ่กว่า sqrt (N) อย่างเห็นได้ชัดช่วยได้มาก
เลเวลริเวอร์เซนต์

1
@steveverrill เมื่อพิจารณาจากขีด จำกัด บนของNแล้วควรมีปัจจัยสูงสุด 30 ตัว (สูงสุด) ซึ่งจะเพิ่มความเร็วให้สูงขึ้นเล็กน้อย อย่างไรก็ตามอย่าลังเลที่จะไร้เดียงสา หากอัลกอริทึมของคุณไม่น่าจะให้คำตอบได้ภายในสองสามชั่วโมงการพิสูจน์แนวคิดที่ได้รับการอธิบายอย่างดีจะช่วยให้ผู้มีสิทธิเลือกตั้งตัดสินใจ
Geobits

สร้างขึ้นในที่อนุญาตให้คุณทำผลิตภัณฑ์คาร์ทีเซียนของทั้งสองรายการได้รับอนุญาต?
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบ:


5

Pyth - 24 23 22 21 ไบต์

ไม่ใช่ทางออกที่ซับซ้อน จะมีการตีกอล์ฟมากขึ้น เพียงใช้ผลิตภัณฑ์รายการและตัวกรองของคาร์ทีเซียน กลยุทธ์เดียวกับ @optimizer (ฉันเดาเพราะความเห็นของเขาไม่ได้ถอดรหัส CJam นั้น) ขอบคุณ @FryAmTheEggman เป็นเวลา 2 ไบต์และหลอกด้วย M

Ml{m`Sdfqu*GHT1G^r2GH

กำหนดฟังก์ชั่นgด้วย args GและH

M                    function definition of g with args G and H
 l                   length of
  {                  set (eliminates duplicates)
   m                 map
    `Sd              repr of sorted factors so can run set (on bash escape ` as \`)
    f                filter
     q      G        equals first arg
      u*GHT1         reduce by multiplication
     ^     H         cartesian product by repeat second arg
       r2G           range 2 to first arg

ทำงานในการทดสอบทั้งหมดยกเว้นครั้งสุดท้ายช้าเกินไป แต่ไม่มีการ จำกัด เวลา


อินพุตเป็นรูปแบบที่ดี
Geobits

1
Pyth ปลายกอล์ฟ: ถ้าคุณได้รับ 2 ข้อโต้แย้งก็มักจะสั้นเพื่อการใช้งานMที่กำหนดฟังก์ชั่นg2 ข้อโต้แย้งและG นี่คือสิ่งที่ผมได้รับนี้:H Ml{msdfqu*GHT1G^r2GHยินดีที่ได้พบผู้ใช้
Pyth

@FryAmTheEggman อัปเดตขอบคุณสำหรับคำแนะนำ
Maltysen

1
ดูเหมือนว่าจะให้คำตอบที่ไม่ถูกต้องสำหรับข้อมูล72 3ที่ส่งคืน 5 แต่ในความเป็นจริงมี 6 คำตอบ(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
isaacg

1
@isaacg โอ้ตกลงฉันจะแปลงกลับเป็นรุ่นถ่าน 21 ตัวของฉัน ฉันไม่คิดว่าการรวมมันจะใช้งานได้ แต่มันก็ดูเหมือนดังนั้นฉันจะกลับไปตอบโต้ ขอบคุณสำหรับการจับ
Maltysen

9

Python 3, 59

f=lambda N,M,i=2:i<=N and f(N/i,M-1,i)+f(N,M,i+1)or-~M==N<2

iเรานับขึ้นหารที่มีศักยภาพ ด้วยอาร์กิวเมนต์เพิ่มเติมiเป็นตัวหารที่ได้รับอนุญาตต่ำสุดความสัมพันธ์แบบเรียกซ้ำหลักคือ

f(N,M,i)=f(N/i,M-1,i)+f(N,M,i+1)

สำหรับแต่ละiเราเลือกที่จะรวมไว้ (เป็นไปได้เช่นการทำซ้ำ) ซึ่งในกรณีนี้เราแบ่งสินค้าที่จำเป็นNโดยและลดลงi Mถ้าเราทำไม่ได้เราเพิ่มขึ้นiโดยที่ 1 แต่ถ้าเนื่องจากไม่มีตัวหารใช้การตรวจสอบมากกว่าi<NN

เมื่อตัวหารขั้นต่ำiเกินกว่าNจะไม่มีตัวหารที่เป็นไปได้อีก ดังนั้นเราตรวจสอบว่าเราประสบความสำเร็จโดยการดูว่าM==0 and N==1หรือเทียบเท่าM+1==N==1หรือM+1==N<2ตั้งแต่เมื่อใดM+1==Nค่ารวมทั้งคู่จะรับประกันว่าเป็นจำนวนเต็มบวก (ขอบคุณ FryAmTheEggman สำหรับการเพิ่มประสิทธิภาพนี้)

รหัสนี้จะทำให้เกิดการล้นสแต็คNประมาณ 1,000 ในระบบส่วนใหญ่ แต่คุณสามารถเรียกใช้ในStackless Pythonเพื่อหลีกเลี่ยงปัญหานี้ ยิ่งกว่านั้นมันช้ามากเนื่องจากการแยกแบบซ้ำแบบเอกซ์โพเนนเชียล


ฉันคิดว่าคุณสามารถใช้-~M==N<2
FryAmTheEggman

@FryAmTheEggman ผมคิดว่าจะให้ผลบวกปลอม แต่แน่นอนมันทำงานขอบคุณที่ จำกัด ร่วมกันและM Nขอบคุณ!
xnor

4

ทับทิม, 67

f=->n,m,s=2,r=0{m<2?1:s.upto(n**0.5){|d|n%d<1&&r+=f[n/d,m-1,d]}&&r}

มีประสิทธิภาพพอสมควรจริง ๆ สำหรับนิยามแบบวนซ้ำ สำหรับแต่ละคู่หาร[d,q]ของ n ด้วยการเป็นหนึ่งที่มีขนาดเล็กเราสรุปผลมาจากการd f[q,m-1]ส่วนที่ยุ่งยากคือในการโทรภายในเราจะ จำกัด ปัจจัยให้มากกว่าหรือเท่ากับ d เพื่อที่เราจะได้ไม่ต้องนับซ้ำ

1.9.3-p327 :002 > f[30,2]
 => 3 
1.9.3-p327 :003 > f[2310,4]
 => 10 
1.9.3-p327 :004 > f[15,4]
 => 0 
1.9.3-p327 :005 > f[9,2]
 => 1 

2

CJam, 48 ไบต์

อาจสั้นกว่านี้มาก แต่ฉันได้เพิ่มการตรวจสอบบางอย่างเพื่อให้สามารถทำงานMกับคอมไพเลอร์ออนไลน์ได้อย่างเหมาะสม

q~\:N),2>{N\%!},a*{_,2/)<m*{(+$}%}*{1a+:*N=},_&,

ลองออนไลน์ได้ที่นี่


นี่คือรถม้าชนิดเล็ก 2 1การป้อนข้อมูลลอง ผลลัพธ์ที่คาดหวัง: 1. ผลลัพธ์จริง: 0.
Peter Taylor

@PeterTaylor ถอนหายใจ แก้ไขแล้ว.
เครื่องมือเพิ่มประสิทธิภาพ

2

T-SQL 456 373

ฉันแน่ใจว่าสิ่งนี้จะพังเมื่ออินพุตใกล้เคียงกับขนาดใหญ่

ขอบคุณ @MickyT ที่ช่วยประหยัดอักขระจำนวนมากด้วย CONCAT และ SELECTing แทนที่จะเป็น SET หลายชุด

CREATE PROC Q(@N INT,@M INT)AS
DECLARE @ INT=2,@C VARCHAR(MAX)='SELECT COUNT(*)FROM # A1',@D VARCHAR(MAX)=' WHERE A1.A',@E VARCHAR(MAX)=''CREATE TABLE #(A INT)WHILE @<@N
BEGIN
INSERT INTO # VALUES(@)SET @+=1
END
SET @=1
WHILE @<@M
BEGIN
SELECT @+=1,@C+=CONCAT(',# A',@),@D+=CONCAT('*A',@,'.A'),@E+=CONCAT(' AND A',@-1,'.A<=A',@,'.A')END
SET @C+=CONCAT(@D,'=',@N,@E)EXEC(@C)

ฉันต้องการถอนรากถอนโคนนี้ แต่ฉันไม่สามารถหาวิธีง่ายๆในการทดสอบ ความคิดใด ๆ การยืนยันโดยบุคคลที่สามว่าใช้งานได้ดีเช่นกัน
Geobits

ฉันได้รับข้อผิดพลาดในการแปลงสองสามข้อที่เราเรียกใช้ (2012) พวกเขาดูเหมือนจะมาจากงบเหล่านี้SET @C+=',# A'+@และSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
MickyT

SET @C+=@D+'=@N'+@E+' SELECT @'นอกจากนี้คุณยังจะต้องแก้ไข อยู่ภายในคำพูดที่ทำให้มันนอกขอบเขตเมื่อคุณดำเนินการ@N @Cนอกจากนี้ฉันคิดว่าคุณจะจบการนับซ้ำ
MickyT

ตอนนี้ฉันได้ทำการทดสอบในปี 2555 มันน่าจะใช้ได้แล้ว
bmarks

2
ใช้งานได้ดีตอนนี้ :) สถานที่สองแห่งที่คุณสามารถโกนตัวละครได้ ลองใช้CONCATเพื่อสร้างสตริงของคุณ จากนั้นคุณสามารถปล่อยCONVERTs ลองSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)ในWHILEวงของคุณ ควรประหยัดจำนวนที่เหมาะสม
MickyT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.