algorithm expressions - andstudy/forge GitHub Wiki

ํ•ด๋‹ต

  • ํ•ด๋‹ต ์—†์ด ๊ทœ์น™ ์ฐพ๊ธฐ ๋„ˆ๋ฌด ๊ท€์ฐฎ์Œ. ใ…‹

      #include <stdio.h>
      
      #define NUMBERLENGTH 23
      #define ONEDIGIT 10000
      
      typedef struct _longlong {
      	unsigned int h[NUMBERLENGTH];
      } longlong;
      
      static int n, d;
      static longlong result;
      static longlong c[151][151];
      static longlong e[151];
      static longlong f[151][151];
      
      void assign(longlong *a, unsigned int b)
      {
      	int i;
      	for(i=0 ; i<NUMBERLENGTH ; i++)
      	{
      		a->h[i] = b % ONEDIGIT;
      		b /= ONEDIGIT;
      	}
      }
      
      void add(longlong *c, const longlong *a, const longlong *b)
      {
      	int i, carry;
      
      	carry = 0;
      	for(i=0 ; i<NUMBERLENGTH ; i++)
      	{
      		c->h[i] = a->h[i] + b->h[i] + carry;
      		carry = c->h[i] / ONEDIGIT;
      		c->h[i] %= ONEDIGIT;
      	}
      }
      
      void sub(longlong *c, const longlong *a, const longlong *b)
      {
      	int i, carry;
      
      	carry = 0;
      	for(i=0 ; i<NUMBERLENGTH ; i++)
      	{
      		if(a->h[i] >= b->h[i])
      		{
      			c->h[i] = a->h[i] - b->h[i] + carry;
      			carry = 0;
      		}
      		else
      		{
      			c->h[i] = (ONEDIGIT + a->h[i]) - b->h[i] + carry;
      			carry = -1;
      		}
      	}
      }
      
      void mul(longlong *c, const longlong *a, const longlong *b)
      {
      	int i, j, carry;
      	unsigned int temp;
      	int in, jn;
      	longlong d;
      
      	for(i=0 ; i<NUMBERLENGTH ; i++)
      		d.h[i] = 0;
      	in = jn = NUMBERLENGTH - 1;
      
      	while(a->h[in] == 0)
      		in--;
      	in++;
      	while(b->h[jn] == 0)
      		jn--;
      	jn++;
      
      	for(i=0 ; i<in+1 ; i++)
      	{
      		carry = 0;
      		for(j=0 ; j<jn+1 ; j++)
      		{
      			if(i+j < NUMBERLENGTH)
      			{
      				temp = (d.h[i+j] + a->h[i]*b->h[j] + carry) % ONEDIGIT;
      				carry = (d.h[i+j] + a->h[i]*b->h[j] + carry) / ONEDIGIT;
      				d.h[i+j] = temp;
      			}
      		}
      	}
      
      	for(i=0 ; i<NUMBERLENGTH ; i++)
      		c->h[i] = d.h[i];
      }
      
      void print(const longlong *a)
      {
      	int sw;
      	int i;
      	sw = 0;
      
      	for(i=NUMBERLENGTH-1 ; i>=0 ; i--)
      	{
      		if(!(sw==0 && a->h[i]==0))
      		{
      			if(sw==0)
      			{
      				printf("%d", a->h[i]);
      				sw = 1;
      			}
      			else {
      				printf("%04d", a->h[i]);
      			}
      		}
      	}
      	if(sw==0)
      		printf("0");
      }
      
      void solve(void)
      {
      	int i, j, k;
      	longlong p;
      
      	assign(&e[0], 1);
      	assign(&e[1], 1);
      	assign(&e[2], 2);
      	
      	for(i=3 ; i<=150 ; i++)
      	{
      		assign(&e[i], 0);
      		for(j=1 ; j<=i ; j++)
      		{
      			mul(&p, &e[j-1], &e[i-j]);
      			add(&e[i], &e[i], &p);
      		}
      	}
      	
      	for(i=0 ; i<=150 ; i++)
      	{
      		for(j=0 ; j<=150 ; j++)
      		{
      			if(i==0 && j==0)
      				assign(&f[i][j], 1);
      			else if(i<=j)
      				f[i][j] = e[i];
      			else if(j==1)
      				assign(&f[i][j], 1);
      			else if(j==0)
      				assign(&f[i][j], 0);
      			else
      			{
      				assign(&f[i][j], 0);
      				for(k=1 ; k<=i ; k++)
      				{
      					mul(&p, &f[k-1][j-1], &f[i-k][j]);
      					add(&f[i][j], &f[i][j], &p);
      				}
      			}
      		}
      	}
      }
      
      void main(void)
      {
      	solve();
      
      	while(scanf("%d %d", &n, &d) != EOF)
      	{
      		sub(&result, &f[n/2][d], &f[n/2][d-1]);
      		print(&result);
      		printf("\n");
      	}
      }
    

Outbreak

๋ฌธ์ œ ์š”์•ฝ

  • X ๋ผ๋Š” ๋ฌธ์ž์—ด ํ‘œํ˜„์‹์˜ ๊ทœ์น™์„ ๋งŒ์กฑ ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ!
  • ์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•์„ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ.. BUT..

๋ฌธ์ œ ํ•ด๊ฒฐ

  • X ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” 3๊ฐ€์ง€ ๊ทœ์น™์„ ์ด์šฉํ•ด ์กฐํ•ฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฐพ๋Š”๋‹ค.
    • () ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ
      • empty string ๊ณผ ๊ฒฐํ•ฉ ์‹œํ‚ด
      • ()์„ ์”Œ์›€
      • ํ˜„์žฌ ๋งŒ๋“ค์–ด์ง„ X์˜ ์ง‘ํ•ฉ ์›์†Œ์— ๋Œ€ํ•ด ์ค‘๋ณต์ˆœ์—ด ๊ตฌํ•จ

์†Œ๊ฐ

  • ์†์œผ๋กœ ๋จผ์ € ํ’€์–ด์•ผ ํ•˜๋Š”๋ฐ.. ์—ญ์‹œ๋‚˜ ์‰ฝ์ง€ ์•Š์Œ.
  • ์•„๋ž˜ ์ฝ”๋“œ๋„ ์ตœ์ ํ™” ํ•˜๋ฉด ํ•ด๋ณผ๋งŒ ํ•˜์ง€ ์•Š..??
  • ์•„์ง์€ ์ปดํ„ฐ ์„ฑ๋Šฅ์ด ๋ณ„๋ฃจ์ธ๋“ฏ? ( ..)
  • ํ›„ํ›„;;

ํ’€์ด

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Expressions
    {
        class X
        {
            public int depth;
            public string value;
    
            public X(int depth, string value)
            {
                this.depth = depth;
                this.value = value;
            }
    
            // 0 Operation
            public static X operator -(X x1)
            {
                return new X(x1.depth, x1.value);
            }
    
            // ๊ฒ‰์˜ท ์ž…ํžˆ๊ธฐ
            public static X operator +(X x1)
            {
                return new X(x1.depth+1, string.Format("({0})", x1.value));
            }
    
            // ๋‘๊ฐœ ํ•ฉํ•˜๊ธฐ
            public static X operator +(X x1, X x2)
            {
                return new X(Math.Max(x1.depth, x2.depth), string.Format("{0}{1}", x1.value, x2.value));
            }
    
            public override string ToString()
            {
                return string.Format("{0} : {1}", value, depth);
            }
        }
    
        class Combination
        {
            List<X> pool;
            Dictionary<string, int> dic;
    
            public Combination()
            {
                pool = new List<X>();
                dic = new Dictionary<string, int>();
            }
    
            public void Add(X x)
            {
                if (dic.ContainsKey(x.value))
                    return;
    
                pool.Add(x);
                dic.Add(x.value, 1);
            }
    
            public Combination Next()
            {
                Combination next = new Combination();
    
                foreach (X x in pool)
                {
                    next.Add(-x);
                }
    
                foreach (X x in pool)
                {
                    next.Add(+x);
                }
    
                foreach (X x1 in pool)
                {
                    foreach (X x2 in pool)
                    {
                        next.Add(x1 + x2);
                    }
                }
    
                return next;
            }
    
            public int Find(int length, int depth)
            {
                int result= 0;
    
                foreach (X x in pool)
                {
                    if (x.value.Length==length && x.depth==depth)
                    {
                        //Console.WriteLine("๋‹ต : {0}", x);
                        result++;
                    }
                }
    
                return result;
            }
            
            public void Display()
            {
                int order = 0;
                foreach(X x in pool)
                {
                    Console.WriteLine(string.Format("{0}\t{1}", order++, x));
                }
    
                Console.WriteLine();
            }
        }
          
        class Program
        {
            static void Main(string[] args)
            {
                // 1. >  ์กฐํ•ฉ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
                Combination combination = new Combination();
    
                combination.Add(new X(1, "()"));
                
                for (int i = 0; i < 4/*1000*/; i++)
                {                
                    // ํ˜„์žฌ ํ•˜๋“œ์›จ์–ด๋กœ๋Š” 4๊นŒ์ง€๋งŒ ํ•ด๋ณผ๋งŒ ํ•จ
                    combination = combination.Next();
                    combination.Display();
                }
    
                // 2. > ๋ฌธ์ œ ํ’€๊ธฐ
                Console.WriteLine(combination.Find(6, 2));
                Console.WriteLine(combination.Find(300, 150));
            }
        }
    }

์Šคํ„ฐ๋””ํ’€์ด

๋ฌธ์ œ ํ’€์ด

  • ํ…Œ์ŠคํŠธ 1์ฐจ

      #include <stdio.h>
      typedef unsigned long long BigInteger;
      BigInteger Matrix[151][151];
      
      BigInteger GetMatrix(int n, int d )
      {
      	if( n < 0 || d < 0 ) return 0;
      	if( n < d ) d = n;
      
      	return Matrix[n][d];
      }
      
      void CalMatrix(int n, int d)
      {
      	for(int j = 0; j < n; j++ )
      	{
      		Matrix[n][d] += GetMatrix(j,d-1)*GetMatrix(n-1-j,d);
      	}
      }
      
      void MakeMatrix()
      {
      	Matrix[0][0] = 1;
      
      	for(int i = 1; i <= 150; i++ )
      	{
      		for(int j = 1; j <= i; j++ )
      		{
      			CalMatrix(i, j);
      		}
      	}
      }
      
      void PrintResult(int n, int d)
      {
      	printf("%llu\n", Matrix[n][d] - Matrix[n][d-1]);
      }
      
      int main()
      {
      	int n, d;
      
      	MakeMatrix();
      
      	while( scanf("%d %d", &n, &d) == 2 )
      	{
      		//n /= 2;
      		PrintResult(n, d);
      	}
      
      	return 0;
      }
    

Mastojun

๋ฌธ์ œ ํ’€์ด

  • Solved ๋ฐ›์€ ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. charํ•œ๊ฐœ์— 1์ž๋ฆฌ ํ•˜๋Š”๊ฒƒ๋ณด๋‹ค intํ˜• ํ•œ๊ฐœ์— 4์ž๋ฆฌ์”ฉ ํ•˜๋Š”๊ฒŒ ์†๋„๊ฐ€ 10๋ฐฐ์ •๋„ ๋น ๋ฆ…๋‹ˆ๋‹ค.(์ •ํ™•ํžˆ ์žฐ๊ฑด ์•„๋‹ˆ๊ณ  ๋А๋‚Œ์ƒ,,) ์ฃผ์„์ฒ˜๋ฆฌ ํ•œ ๊ฒƒ์„ ๋ฐ”๊พธ์–ด์ฃผ๋ฉด ์†๋„๋น„๊ต๋ฅผ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • charํ˜•์œผ๋กœ ๊ณ„์‚ฐํ• ๋• Show๋ฉ”์†Œ๋“œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์•ผ ๊ฒ ๋„ค์š” ^^;; %04d๋ฅผ %d๋กœ;
  • www.programming-challenges.com ์— ์ œ์ถœํ•˜๋ฉด ์‹คํ–‰์‹œ๊ฐ„์ด 7์ดˆ์ด์ƒ, UVa์— ์ œ์ถœํ•˜๋ฉด 1์ดˆ๋„ค์š”.

    • ๋†€๋ผ์šด๊ฑด ์ตœ๊ณ ์†๋„๊ฐ€ PC์—์„œ 0.019์ดˆ ๋ผ๋Š”.... ํ…Œ์ŠคํŠธ ์ž…๋ ฅ๊ฐ’์„ ๋นผ๋‚ด์™€์„œ ๊ฒฐ๊ณผ๋งŒ ๋ฟŒ๋ ค์ค€๊ฑฐ๋ผ๊ณ  ์ถ”์ธกํ•ด๋ด…๋‹ˆ๋‹ค;
      • ์†Œ์ผ“ ํ”Œ๋ฐํ•ด์„œ ์ž…๋ ฅ๊ฐ’ ๋ฐ›์„ ๋•Œ, ๋‚ด IP๋กœ ์˜๊ฒŒ ํ•˜๋ฉด ๋˜๊ฒ ๋Š” ๊ฑธ์š”! ํ•ด๋ด์•ผ์ง€ ใ…‹ใ…‹
      • ๋งž์•„์š”! ใ…‹ ํ•˜์ง€๋งŒ... ๊ทธ๋Ÿฐ์‹์œผ๋กœ ์ž…๋ ฅ๊ฐ’ ๋นผ์™€์„œ ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅํ•˜๊ฒŒ 3n+1์„ ๋งŒ๋“ค์–ด์„œ ์ œ์ถœํ–ˆ์—ˆ๋Š”๋ฐ.. ์ตœ๊ณ ์†๋„๋ณด๋‹ค ๋А๋ ธ์—ˆ๋‹ค๋Š” ;;;;;
      • ์˜ค.. ์ข‹์€ ์ƒ๊ฐ์ธ๋ฐ์š”.. ใ…‹ใ…‹
  • ๊ตฌํ˜„ํ• ๋•Œ ๋ณด๋‹ˆ, ์ฝ”๋”ฉ์‹œ์—ฐํ• ๋•Œ๋Š” ๊ณฑํ•˜๊ธฐ๋ฅผ ์™„์ „ ์ž˜๋ชป ๊ตฌํ˜„ํ–ˆ์—ˆ์–ด์š”, :$

  • ์ฑ…์˜ ํ•ด๋‹ต๋ณด๋‹ค๋„ ์†๋„ ๋น ๋ฅธ๊ฑฐ ๊ฐ™์•„์š”!

    • ์˜ค~ ๋‚˜์ด์Šค~ ^ใ…‡^/
  • ์—ญ์‹œ ํ”ผ๊ณคํ• ๋• ์ž ์„ ์ž์ฃผ๋Š”๊ฒŒ ์ตœ๊ณ , ๋•๋ถ„์— KLDP๋ชป๊ฐ”๋‹ค๋Š”;;;

์†Œ์Šค์ฝ”๋“œ

    #include <stdio.h>
    #include <string.h>
    #define max(x,y) ((x)>(y)?(x):(y))
    
    #define MAXLEN 25
    #define ONEDIGIT 10000
    typedef int num;
    /*
    #define MAXLEN 200
    #define ONEDIGIT 10
    typedef char num;
    */
    class BigNumber
    {
    public:
    	BigNumber()
    	{
    		Init();	
    	}
    
    	BigNumber(char* in)
    	{
    		Init();
    
    		length = strlen(in);
    		for(int i = length-1; i >= 0; i-- )
    		{
    			Number[i] = in[length-i-1] - '0';
    		}
    	}
    
    	BigNumber(int in)
    	{
    		Init();
    
    		while(in)
    		{
    			Number[length] = in%ONEDIGIT;
    			in/= ONEDIGIT;
    			length++;
    		}
    	}
    
    	const BigNumber& operator+=(const BigNumber& rhs)
    	{
    		int i;
    		int carry = 0;
    		int MaxLen = max(rhs.length, length);
    
    		for( i = 0; i < MaxLen; i++ )
    		{
    			Number[i] = rhs.Number[i] + Number[i] + carry;
    
    			if( Number[i] >= ONEDIGIT )
    			{
    				Number[i] -= ONEDIGIT;
    				carry = 1;
    			}
    			else
    			{
    				carry = 0;
    			}						
    		}
    
    		if( carry )
    		{
    			length = MaxLen+1;
    			Number[i] = carry;
    		}
    		else
    		{
    			length = MaxLen;
    		}
    
    		return *this;
    	}
    
    	const BigNumber& operator-=(const BigNumber& rhs)
    	{
    
    		for(int i = 0; i < length; i++ )
    		{
    			Number[i] = Number[i] - rhs.Number[i];
    			while( Number[i] < 0 )
    			{
    				Number[i] += ONEDIGIT;
    				Number[i+1] -= 1;
    			}
    		}
    
    		int i;
    
    		for(i = length-1; i >= 0; i-- )
    		{
    			if( Number[i] != 0 )
    			{
    				break;
    			}
    		}
    
    		length = i+1;
    
    		return *this;
    	}
    
    	const BigNumber& operator*=(const BigNumber& rhs)
    	{
    		BigNumber Temp;
    		int i, j;
    		int carry = 0;
    		
    		for( i = 0; i < length; i++ )
    		{
    			for( j = 0; j < rhs.length; j++ )
    			{
    				Temp.Number[i+j] += Number[i]*rhs.Number[j];
    
    				if(Temp.Number[i+j] >= ONEDIGIT )
    				{
    					Temp.Number[i+j+1] += Temp.Number[i+j]/ONEDIGIT;
    					Temp.Number[i+j] %= ONEDIGIT;
    				}
    			}
    		}
    
    		for( i = MAXLEN-1; i >= 0; i-- )
    		{
    			if(Temp.Number[i] != 0 )
    			{
    				Temp.length = i+1;
    				break;
    			}
    		}
    
    		*this = Temp;
    
    		return *this;
    	}
    
    	void Show()
    	{
    		if( length == 0 )
    		{
    			printf("0\n");
    			return;
    		}
    
    		printf("%d", Number[length-1]);
    
    		for(int i = length-2; i >= 0; i-- )
    		{
    			printf("%04d", Number[i]);
    		}
    
    		printf("\n");
    	}
    
    private:
    
    	void Init()
    	{
    		length = 0;
    		for(int i = 0; i < MAXLEN; i++ )
    		{
    			Number[i] = 0;
    		}
    	}
    
    	num Number[MAXLEN];
    	int length;
    };
    
    const BigNumber operator+(const BigNumber& lhs, const BigNumber& rhs)
    {
    	BigNumber Temp(lhs);
    
    	Temp += rhs;
    
    	return Temp;
    }
    
    const BigNumber operator-(const BigNumber& lhs, const BigNumber& rhs)
    {
    	BigNumber Temp(lhs);
    
    	Temp -= rhs;
    
    	return Temp;
    }
    
    const BigNumber operator*(const BigNumber& lhs, const BigNumber& rhs)
    {
    	BigNumber Temp(lhs);
    
    	Temp *= rhs;
    
    	return Temp;
    }
    
    BigNumber Matrix[151][151] = {0};
    
    
    BigNumber GetMatrix(int n, int d )
    {
    	if( n == 0 && d == 0 ) return 1;
    	if( n < d ) d = n;
    	
    
    	return Matrix[n][d];
    }
    
    void PrintResult(int n, int d )
    {
    	BigNumber Temp(GetMatrix(n, d) - GetMatrix(n, d-1));
    
    	Temp.Show();
    }
    
    void CalMatrix(int n, int d )
    {
    	for(int i = 0; i < n; i++ )
    	{
    		Matrix[n][d] += GetMatrix(i, d-1)*GetMatrix(n-1-i, d);
    	}
    }
    
    void MakeMatrix()
    {
    	Matrix[0][0] = 1;
    
    	for(int i = 1; i <= 150; i++ )
    	{
    		for(int j = 1; j <= i; j++ )
    		{
    			CalMatrix(i, j);
    		}
    	}
    }
    
    int main()
    {
    	int n, d;
    
    	MakeMatrix();
    
    	while( scanf("%d %d", &n, &d) == 2 )
    	{
    		n /= 2;
    		PrintResult(n, d);
    	}
    	
    	return 0;
    }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ