Advertisement
EWTD

7

Sep 18th, 2021
1,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.36 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "math"
  6. )
  7. type Ratio struct {
  8.     num int
  9.     denum int
  10. }
  11. type stack []string
  12.  
  13. func (s *stack) Push(v string){
  14.     *s = append(*s, v)
  15. }
  16.  
  17. func (s *stack) Pop() string {
  18.     if len(*s) == 0{
  19.         panic(s)
  20.     }
  21.     l := len(*s)
  22.     val := (*s)[l-1]
  23.     *s = (*s)[:l-1]
  24.     return val
  25. }
  26. func (s *stack) IsEmpty() bool{
  27.     return len(*s) == 0
  28. }
  29. func ScanRatio(ratio *Ratio){
  30.     fmt.Scan(&ratio.num)
  31.     ratio.denum = 1
  32. }
  33. func (ratio *Ratio) Sub(value Ratio){
  34.     Simplify(&value)
  35.     ratio.num = ratio.num*value.denum - value.num*ratio.denum
  36.     ratio.denum = ratio.denum* value.denum
  37.     Simplify(ratio)
  38. }
  39. func (ratio *Ratio) Mul(value Ratio){
  40.     Simplify(&value)
  41.     ratio.num = ratio.num * value.num
  42.     ratio.denum = ratio.denum * value.denum
  43.     Simplify(ratio)
  44. }
  45. func (ratio *Ratio) ToFloat() float64{
  46.     return float64(ratio.num)/float64(ratio.denum)
  47. }
  48. func  Mul(lhs , rhs Ratio) Ratio{
  49.     var res Ratio
  50.     res.num = lhs.num * rhs.num
  51.     res.denum = lhs.denum * rhs.denum
  52.     Simplify(&res)
  53.     return res
  54. }
  55. func (ratio *Ratio) Div(value Ratio){
  56.     Simplify(&value)
  57.     ratio.num = ratio.num* value.denum
  58.     ratio.denum = ratio.denum* value.num
  59.     Simplify(ratio)
  60. }
  61. func abs(ratio Ratio) Ratio{
  62.     return Ratio{int(math.Abs(float64(ratio.num))),int(math.Abs(float64(ratio.denum)))}
  63. }
  64. func Greater(lhs Ratio, rhs Ratio) bool{
  65.     return float64(lhs.num)/float64(lhs.denum) > float64(rhs.num)/float64(rhs.denum)
  66. }
  67. func Simplify(ratio *Ratio, is_strict ...int){
  68.     if len(is_strict) == 0 && math.Max(math.Abs(float64(ratio.denum)),float64(ratio.num)) < 1000000{
  69.         return
  70.     }
  71.     if ratio.ToFloat() == 0{
  72.         ratio.num = 0
  73.         ratio.denum = 1
  74.         return
  75.     }
  76.     if ratio.num*ratio.denum > 0{
  77.         if ratio.denum < 0 {
  78.             ratio.num *= -1
  79.             ratio.denum *= -1
  80.         }
  81.     }else if ratio.denum < 0{
  82.         ratio.num *= -1
  83.         ratio.denum *= -1
  84.     }
  85.     stop := math.Sqrt(math.Max(math.Abs(float64(ratio.denum)),float64(ratio.num)))
  86.     for i := 2; float64(i) <= stop; i++{
  87.         for ratio.num % i == 0 && ratio.denum % i == 0{
  88.             ratio.num /= i
  89.             ratio.denum /= i
  90.         }
  91.         //stop = math.Sqrt(math.Max(math.Abs(float64(ratio.denum)),float64(ratio.num)))
  92.     }
  93. }
  94. func ToString(ratio *Ratio) string{
  95.     Simplify(ratio,1)
  96.     return fmt.Sprintf("%d/%d",ratio.num,ratio.denum)
  97. }
  98. func main() {
  99.     var n int
  100.     fmt.Scan(&n)
  101.  
  102.     B := make([]Ratio, n)
  103.     A := make([][]Ratio, n)
  104.     for i := 0; i < n; i++ {
  105.         A[i] = make([]Ratio, n)
  106.         for j := 0; j < n; j++ {
  107.             ScanRatio(&A[i][j])
  108.         }
  109.         ScanRatio(&B[i])
  110.     }
  111.     k := 0
  112.     max := Ratio{math.MinInt32,1}
  113.     eps := Ratio{1,100000}
  114.     var tmp Ratio
  115.     for k < n{
  116.         max = abs(A[k][k])
  117.         index := k
  118.         for i := k+1; i < n; i++{
  119.             tmp = abs(A[i][k])
  120.             if Greater(tmp,max) {
  121.                 max = abs(A[i][k])
  122.                 index = i
  123.             }
  124.         }
  125.         if Greater(eps,max){
  126.             fmt.Println("No solution")
  127.             return
  128.         }
  129.         for i := 0; i < n; i++{
  130.             A[index][i],A[k][i] = A[k][i], A[index][i]
  131.         }
  132.         B[index],B[k] = B[k], B[index]
  133.  
  134.         for i := k; i < n; i++{
  135.             tmp = A[i][k]
  136.             if Greater(eps,abs(tmp)){
  137.                 continue
  138.             }
  139.             for j := 0; j < n; j++{
  140.                 A[i][j].Div(tmp)
  141.             }
  142.             B[i].Div(tmp)
  143.             if i == k{
  144.                 continue
  145.             }
  146.             for j := 0; j < n; j++ {
  147.                 A[i][j].Sub(A[k][j])
  148.             }
  149.             B[i].Sub(B[k])
  150.         }
  151.         k++
  152.     }
  153.     var buffer stack
  154.     for i := n-1; i >= 0; i--{
  155.         buffer.Push(ToString(&B[i]))
  156.         for j := 0; j < i; j++{
  157.             B[j].Sub(Mul(A[j][i],B[i]))
  158.         }
  159.     }
  160.     for !buffer.IsEmpty(){
  161.         fmt.Println(buffer.Pop())
  162.     }
  163.  
  164. }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement