2014年11月21日 星期五

[UVA] 516 - Prime Land

/*20141122 hanting*/
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s) && s!="0")
    {
        stringstream sin(s);
        int sum=1;
        int _pow;
        int num;
        while(sin>>num>>_pow) sum*=pow(num,_pow);
        sum--;
        bool Num[50000]={0};
        int prime[10000];
        int x=0;
        for(int i=2;i<50000;i++)
        {
            if(Num[i]==0)
            {
                prime[x++]=i;
                for(int j=i*2;j<50000;j+=i)
                {
                    Num[j]=1;
                }
            }
        }
        int ans[1000];
        int q=0;
        for(int i=0;sum!=1;i++)
        {
            while(sum%prime[i]==0)
            {
                ans[q++]=prime[i];
                sum/=prime[i];
            }
        }
        for(int i=q-1;i>=0;i--)
        {
            int pow=1;
            if(i!=q-1) cout<<" ";
            cout<<ans[i];
            while(i-1>=0 && ans[i-1]==ans[i])
            {
                pow++;
                i--;
            }
            cout<<" "<<pow;
        }
        cout<<endl;
    }
}

2014年11月11日 星期二

[UVA] 11879 - Multiple of 17

/*20141111 hanting*/
#include <iostream>
using namespace std;
int seventeen[105]={0};
inline bool compare(int *seventeen,int *num)
{
    for(int i=104;i>=0;i--)
    {
        if(num[i]>seventeen[i]) return 0;
        else if(num[i]<seventeen[i]) return 1;
    }
    return 1;
}
bool IsSeventeen(int* num,int p)
{
    if(compare(seventeen,num))
    {
        if((num[0]==7 && num[1]==1)||p==0) return 1;
        else return 0;
    }
    else
    {
        int d=num[0];
        d*=5;
        for(int i=0;i<p-1;i++)//shift ( remove the last number )
        {
            num[i]=num[i+1];
        }

        num[p-1]=0;
        p--;
        int sub_5d[105]={d};
        for(int i=1;i<2;i++)//carry
        {
            sub_5d[i]+=sub_5d[i-1]/10;
            sub_5d[i-1]%=10;
        }
        /*num-5d*/
        int siz=max(p,2);
        for(int i=0;i<siz;i++)
        {
            num[i]-=sub_5d[i];
        }
        for(int i=0;i<siz;i++)
        {
            if(num[i]<0)
            {
                num[i]+=10;
                num[i+1]--;
            }
        }
        if(num[siz]<0)//if( num < 5d )
        {
            num[siz]=0;
            for(int i=0;i<siz;i++)//complement
            {
                num[i]=9-num[i];
            }
            num[0]++;
            for(int i=1;i<siz;i++)//carry
            {
                num[i]+=num[i-1]/10;
                num[i-1]%=10;
            }
        }
        for(int i=104;i>=0;i--)
        {
            if(num[i]!=0)
            {
                p=i+1;
                break;
            }
            else if(i==0) p=0;
        }
        return IsSeventeen(num,p);
    }
}
int main()
{
    seventeen[0]=7;
    seventeen[1]=1;
    string s;
    while(cin>>s && s!="0")
    {
        int num[105]={0};
        int p=0;
        for(int i=s.size()-1;i>=0;i--)
        {
            num[p++]=s[i]-48;
        }
        cout<<IsSeventeen(num,p)<<endl;
    }
    return 0;
}

2014年11月8日 星期六

[UVA] 10140 - Prime Distance

/*20141108 hanting*/
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
bool Num[100000];
int prime[10000];
int x=0;
bool isprime(unsigned int num)
{
    if(num<100000) return Num[num]==0 ? 1:0;
    int s=sqrt(num);//另存s//在for迴圈會慢
    for(int i=0;prime[i]<=s;i++)
    {
        if(num%prime[i]==0) return 0;
    }
    return 1;
}
int main()
{
    for(unsigned int i=2;i<100000;i++) Num[i]=0;
    Num[1]=1;
    for(unsigned int i=2;i<100000;i++)
    {
        if(!Num[i])
        {
            prime[x++]=i;
            for(unsigned int j=i*2;j<100000;j+=i)
            {
                Num[j]=1;
            }
        }
    }
    unsigned int L,U;
    string s;
    while(getline(cin,s))
    {
        stringstream sin(s);
        sin>>L>>U;
        unsigned int l,u;
        for(l=L;!isprime(l);l++);
        L=l;
        for(u=U;!isprime(u);u--);
        U=u;
        if(L>=U) cout<<"There are no adjacent primes."<<endl;
        else
        {
            int clos1=L,clos2=L,dis1=L,dis2=L;
            int temp1=L,temp2=L;
            int mini=U-L+1,maxi=0;
            unsigned int i;
            if(L==2) i=L+1;
            else i=L+2;
            for( i;i<=U;i+=2)
            {//質數一定是6n+1或6n-1,所以+2+4+2+4判斷增加效率
                if(isprime(i))
                {
                    temp1=temp2;
                    temp2=i;
                    if(temp2-temp1<mini)
                    {
                        clos1=temp1;
                        clos2=temp2;
                        mini=clos2-clos1;
                    }
                    if(temp2-temp1>maxi)
                    {
                        dis1=temp1;
                        dis2=temp2;
                        maxi=dis2-dis1;
                    }
                }
                if((i-1)%6==0) i+=2;//+4
            }
            cout<<clos1<<","<<clos2<<" are closest, "<<dis1<<","<<dis2<<" are most distant."<<endl;
        }
    }
    return 0;
}

2014年11月6日 星期四

[UVA] 369 - Combinations

/*20141107 hanting*/
#include <iostream>
using namespace std;
int prime[30];
int factor[100]={0};
int x=0;
void part1(int num)
{
    for(int i=0;num!=1;i++)
    {
        while(num%prime[i]==0)
        {
            factor[prime[i]]++;
            num/=prime[i];
        }
    }
}
void part2(int num)
{
    for(int i=0;num!=1;i++)
    {
        while(num%prime[i]==0)
        {
            factor[prime[i]]--;
            num/=prime[i];
        }
    }
}
void mul(int* ans,int n)
{
    for(int i=0;i<100;i++)
    {
        ans[i]*=n;
    }
    for(int i=1;i<100;i++)
    {
        ans[i]+=ans[i-1]/10;
        ans[i-1]%=10;
    }
}
void output(int *ans)
{
    int i;
    for(i=99;i>=0;i--)
    {
        if(ans[i]!=0) break;
    }
    for(int j=i;j>=0;j--)
    {
        cout<<ans[j];
    }
}
int main()
{
    int Num[100]={0};
    for(int i=2;i<100;i++)
    {
        if(Num[i]==0)
        {
            prime[x++]=i;
            for(int j=i;j<100;j+=i) Num[j]=1;
        }
    }
    int n,m;
    while(cin>>n>>m && n+m)
    {
        for(int i=0;i<100;i++) factor[i]=0;
        cout<<n<<" things taken "<<m<<" at a time is ";
        int ans[100]={1};
        if(m>n/2) m=n-m;;
        for(int i=2;i<=m;i++)
        {
            part2(i);
        }
        for(int i=n;m--;i--)
        {
            part1(i);
        }
        for(int i=2;i<98;i++)
        {
            while(factor[i]--)
            {
                mul(ans,i);
            }
        }
        output(ans);
        cout<<" exactly."<<endl;
    }
    return 0;
}


================================================

# /* 題目: UVa 369 - Combinations
#  * onlinejudge.org/external/3/369.pdf
#  * Language: Python
#  * Created on: 2019年12月19日
#  *   Author: hanting
#  */
def C(a, b):
    if a-b < b :
        b = a-b
    result = 1
    w = 1
    for i in range(a-b+1, a+1):
        result *= i
        result //= w
        w += 1
    return result
while(True):
    x, y = map(int, input().split())
    if [x, y] == [0, 0]:
        break
    print('{} things taken {} at a time is {} exactly.'.format(x, y, C(x, y)))

2014年11月2日 星期日

[UVA] 10303 - How Many Trees ?

/*20141102 hanting*/
/*因為WA不知道錯哪,所以另外又寫了一個版本,
   後來發現存大數用10000會溢位,1000就AC了*/

/*遞迴+重載運算*/
#include <iostream>
#include <vector>
using namespace std;
struct BigNum
{
    vector<int> num;
    void operator+=(BigNum n)
    {
        int R=max(n.num.size(),num.size());
        num.resize(R+1);
        n.num.resize(R+1);
        vector<int> ans(1);
        for(int i=0;i<R;i++)
        {
            ans[i]+=num[i]+n.num[i];
            ans.push_back(ans[i]/1000);
            ans[i]%=1000;
        }
        if(!ans[R]) ans.pop_back();
        num=ans;
    }
    BigNum operator*(BigNum n)
    {
        BigNum ans;
        ans.num.resize(num.size()+n.num.size());
        for(int i=0;i<num.size();i++)
        {
            for(int j=0;j<n.num.size();j++)
            {
                ans.num[i+j]+=num[i]*n.num[j];
            }
        }
        for(int i=1;i<ans.num.size();i++)
        {
            ans.num[i]+=ans.num[i-1]/1000;
            ans.num[i-1]%=1000;
        }
        for(int i=ans.num.size()-1;i>0;i--)
        {
            if(ans.num[i]==0) ans.num.pop_back();
            else break;
        }
        return ans;
    }
    void operator*=(int n)
    {
        vector<int> ans(1);
        for(int i=0;i<num.size();i++)
        {
            ans[i]+=num[i]*2;
            ans.push_back(ans[i]/1000);
            ans[i]%=1000;
        }
        if(!ans[ans.size()-1]) ans.pop_back();
        num=ans;
    }
    friend ostream& operator<<(ostream& out, BigNum& n)
    {
        int first=n.num.size()-1;
        out<<n.num[first];
        for(int i=first-1;i>=0;i--)
        {
            if(n.num[i]<100) out<<0;
            if(n.num[i]<10) out<<0;
            out<<n.num[i];
        }
        return out;
    }
};
BigNum store[1005];
BigNum tree(int n)
{
    if(store[n].num.size()) return store[n];
    else
    {
        for(int i=0;i<n/2;i++)
        {
            store[n]+=tree(i)*tree(n-i-1);
        }
        store[n]*=2;
        if(n%2==1)store[n]+=tree(n/2)*tree(n/2);
        return store[n];
    }
}
int main()
{
    store[0].num.push_back(1);
    store[1].num.push_back(1);
    store[2].num.push_back(2);
    store[3].num.push_back(5);
    int N;
    while(cin>>N)
    {
        tree(N);
        cout<<store[N]<<endl;
    }
    return 0;
}

/*vector+函數*/
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>,vector<int>);
vector<int> mul(vector<int>,vector<int>);
void output(vector<int>);
int main()
{
    int N;
    vector<int> num[1005];
    num[0].push_back(1);
    num[1].push_back(1);
    num[2].push_back(2);
    int MAX=2;
    while(cin>>N)
    {
        if(N<=MAX) output(num[N]);
        else
        {
            for(++MAX;MAX<=N;MAX++)
            {
                for(int i=0;i<MAX/2;i++)
                {
                    num[MAX]=add(num[MAX],mul(num[i],num[MAX-1-i]));
                }
                num[MAX]=mul(num[MAX],num[2]);
                if(MAX%2)
                {
                    num[MAX]=add(num[MAX],mul(num[MAX/2],num[MAX/2]));
                }
            }
            output(num[--MAX]);
        }
    }
    return 0;
}
vector<int> mul(vector<int> a,vector<int> b)
{
    vector<int> Result(a.size()+b.size());
    for(int i=0;i<a.size();i++)
    {
        for(int j=0;j<b.size();j++)
        {
            Result[i+j]+=a[i]*b[j];
        }
    }
    for(int i=1;i<Result.size();i++)
    {
        Result[i]+=Result[i-1]/1000;
        Result[i-1]%=1000;
    }
    for(int i=Result.size()-1;i>=0;i--)
    {
        if(!Result[i]) Result.pop_back();
        else break;
    }
    return Result;
}
vector<int> add(vector<int> a,vector<int> b)
{
    vector<int> Result;
    int Resize=max(a.size(),b.size());
    a.resize(Resize);
    b.resize(Resize);
    for(int i=0;i<a.size();i++)
    {
        Result.push_back(a[i]+b[i]);
    }
    Result.push_back(0);
    for(int i=1;i<Result.size();i++)
    {
        Result[i]+=Result[i-1]/1000;
        Result[i-1]%=1000;
    }
    if(!Result[Result.size()-1]) Result.pop_back();
    return Result;
}
void output(vector<int> N)
{
    for(int i=N.size()-1;i>=0;i--)
    {
        if(i!=N.size()-1&&N[i]<100) cout<<"0";
        if(i!=N.size()-1&&N[i]<10) cout<<"0";
        cout<<N[i];
    }
    cout<<endl;
}

2014年10月23日 星期四

[UVA] 623 - 500!

/*20141023 hanting*/
#include <iostream>
#include <vector>
using namespace std;
vector<int> stage(int);
vector<int> mul(vector<int>,vector<int>);
int main()
{
    int n;
    while(cin>>n)
    {
        cout<<n<<"!"<<endl;
        if(!n)
        {
            cout<<1<<endl;
            continue;
        }
        vector<int> output=stage(n);
        for(int i=output.size()-1;i>=0;i--)
        {
            if(output[i]<10 && i!=output.size()-1) cout<<"00";
            else if(output[i]<100 && i!=output.size()-1) cout<<"0";
            cout<<output[i];
        }cout<<endl;
    }
    return 0;
}
vector<int> stage(int num)
{
    vector<int> return_num;
    int Num=num;
    while(num)
    {
        return_num.push_back(num%1000);
        num/=1000;
    }
    if(Num==1)
    {
        return return_num;
    }
    else
    {
        return mul(return_num,stage(Num-1));
    }
}
vector<int> mul(vector<int> num1,vector<int> num2)
{
    vector<int> result(num1.size()+num2.size(),0);
    for(int i=0;i<num1.size();i++)
    {
        for(int j=0;j<num2.size();j++)
        {
            result[i+j]+=num1[i]*num2[j];
        }
    }
    for(int i=1;i<result.size();i++)
    {
        result[i]+=result[i-1]/1000;
        result[i-1]%=1000;
    }
    for(int i=result.size()-1;i>=0;i--)
    {
        if(!result[i]) result.pop_back();
        else break;
    }
    return result;
}

----------

/* 20151027
 * hanting
 * UVa 623 - 500!
 * C++
 */
#include <iostream>
#include <iomanip> // setw, setfill
using namespace std;
const int maxn = 700;//每一格存4位數
class BigInteger
{
private:
    int val[maxn];
    int digit;
public:
    BigInteger():val{0},digit(0){}
    friend ostream& operator << (ostream &out, BigInteger B);
    BigInteger operator * (int n);
    void operator = (int n);
};
BigInteger fact[1005];
int main()
{
    fact[0] = 1;
    fact[1] = 1;
    for(int i = 2; i < 1005; i++)
    {
        fact[i] = fact[i-1] * i;
    }
    int num;
    while(cin >> num)
    {
        cout << num << "!" << endl << fact[num] << endl;
    }
    return 0;
}
ostream& operator << (ostream &out, BigInteger B)
{
    out << B.val[B.digit-1] ;
    for(int i = B.digit - 2; i >= 0; i-- )
    {
        out << setw(4) << setfill('0') << B.val[i];
    }
    return out;
}
BigInteger BigInteger::operator * (int n)
{
    BigInteger result;
    for(int i = 0; i < digit; i++)
    {
        result.val[i] += val[i] * n;
        result.val[i+1] += result.val[i] / 10000;
        result.val[i] %= 10000;
    }
    result.digit = this ->digit + 10;
    while(!result.val[result.digit-1]) result.digit--;
    return result;
}
void BigInteger::operator = (int n)
{
    while(n)
    {
        val[digit++] = n%10000;
        n /= 10000;
    }
}

2014年9月16日 星期二

[UVA] 120 - Stacks of Flapjacks

/*20140917 hanting*/
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s))
    {
        stringstream sin(s);
        vector<int> a;
        int num;
        while(sin>>num)
            a.push_back(num);
        int flip[a.size()];
        for(int i=0;i<a.size();i++)
        {
            if(i!=0) cout<<" ";
            cout<<a[i];
            flip[i]=a.size()-i;
        }
        cout<<endl;
        int test_sort=1;
        int largest;
        for(int i=a.size()-1;i>=0 && test_sort;i--)
        {
            test_sort=0;
            largest=i;
            for(int j=0;j<i;j++)//find the largest number
            {
                if(a[j]>a[largest])
                {
                    largest=j;
                }
            }
            if(largest!=i)
            {
                if(largest!=0)//take it to the first
                {
                    cout<<flip[largest]<<" ";
                    reverse(a.begin(),a.begin()+largest+1);
                }
                cout<<flip[i]<<" ";
                reverse(a.begin(),a.begin()+i+1);//and then reverse to i
            }
            for(int j=0;j<a.size()-1;j++)
            {
                if(a[j]>a[j+1])
                {
                    test_sort=1;
                    break;
                }
            }
        }
        cout<<0<<endl;
    }
    return 0;
}

2014年9月12日 星期五

[UVA] 10037 - Bridge

/*20140912 hanting*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int N;
    cin>>N;
    int blankline=0;
    while(N--)
    {
        if(blankline) cout<<endl;
        int people;
        cin>>people;
        int temp=people;
        vector<int> a(people);
        for(int i=0;i<people;i++)
        {
            cin>>a[i];
        }
        sort(a.begin(),a.end());
        int A,B,C,D;
        A=0;//first
        B=1;//second
        C=people-2;//last second
        D=people-1;//last
        int sum=0;
        while(people)//consider_sum
        {
            if(people==1)
            {
                sum+=a[A];
                people--;
            }
            else if(people==2)
            {
                sum+=a[B];
                people-=2;
            }
            else if(people==3)
            {
                sum+=a[B]+a[A]+a[D];
                people-=3;
            }
            else
            {
                if(a[B]-a[A]>a[C]-a[B])
                {
                    sum+=a[C]+a[A]+a[D]+a[A];
                }
                else
                {
                    sum+=a[B]+a[A]+a[D]+a[B];
                }
                people-=2;
                C=people-2;
                D=people-1;
            }
        }
        cout<<sum<<endl;
        people=temp;
        A=0;//first
        B=1;//second
        C=people-2;//last second
        D=people-1;//last
        while(people)//cout_tread
        {
            if(people==1)
            {
                cout<<a[A]<<endl;
                people--;
            }
            else if(people==2)
            {
                cout<<a[A]<<" "<<a[B]<<endl;
                people-=2;
            }
            else if(people==3)
            {
                cout<<a[A]<<" "<<a[B]<<endl;
                cout<<a[A]<<endl;
                cout<<a[A]<<" "<<a[D]<<endl;
                people-=3;
            }
            else
            {
                if(a[B]-a[A]>a[C]-a[B])
                {
                    cout<<a[A]<<" "<<a[C]<<endl;
                    cout<<a[A]<<endl;
                    cout<<a[A]<<" "<<a[D]<<endl;
                    cout<<a[A]<<endl;
                }
                else
                {
                    cout<<a[A]<<" "<<a[B]<<endl;
                    cout<<a[A]<<endl;
                    cout<<a[C]<<" "<<a[D]<<endl;
                    cout<<a[B]<<endl;
                }
                people-=2;
                C=people-2;
                D=people-1;
            }
        }
        blankline=1;
    }
    return 0;
}

------------------------------

/* 20151030
 * hanting
 * UVa 10037 - Bridge
 * C++
 */
#include <iostream>
#include <vector>
#include <algorithm> //sort
using namespace std;
int solve(int *num, int n);//return sum
vector<pair<int,int> > Go;
vector<int> Back;
int main()
{
    int testCase;
    cin >> testCase;
    while(testCase--)
    {
        Go.clear();
        Back.clear();
        int numN;
        cin >> numN;
        int num[numN];
        for(int i = 0; i < numN; i++)
        {
            cin >> num[i];
        }
        if(numN == 1)
        {
            cout << num[0] << endl;
            cout << num[0] << endl;
        }
        else
        {
            sort(num, num+numN);
            int sum = solve(num, numN);
            cout << sum << endl;
            cout << Go[0].first << " " << Go[0].second << endl;
            for(int i = 1; i < Go.size(); i++)
            {
                cout << Back[i-1] << endl;
                cout << Go[i].first << " " << Go[i].second << endl;
            }
        }
        if(testCase) cout << endl;
    }
    return 0;
}
int solve(int *num, int n)
{
    int sum = 0;
    int i;
    for(i = n-1; i > 2; i-=2)
    {
        int method1 = num[i] + num[0] + num[i-1] + num[0];
        int method2 = num[1] + num[0] + num[i] + num[1];
        if(method1 < method2)
        {
            Go.push_back(pair<int,int>(num[0],num[i]));
            Back.push_back(num[0]);
            Go.push_back(pair<int,int>(num[0],num[i-1]));
            Back.push_back(num[0]);
            sum += method1;
        }
        else
        {
            Go.push_back(pair<int,int>(num[0],num[1]));
            Back.push_back(num[0]);
            Go.push_back(pair<int,int>(num[i-1],num[i]));
            Back.push_back(num[1]);
            sum += method2;
        }
    }
    if(i == 1)
    {
        Go.push_back(pair<int,int>(num[0],num[1]));
        sum += num[1];
    }
    else
    {
        Go.push_back(pair<int,int>(num[0],num[1]));
        Back.push_back(num[0]);
        Go.push_back(pair<int,int>(num[0],num[2]));
        sum += num[1] + num[0] + num[2];
    }
    return sum;
}

2014年8月26日 星期二

[UVA] 353 - Pesky Palindromes

/*20140826 hanting*/
#include <iostream>
using namespace std;
string temp;
inline string intrstr(string s,int start,int End)
{
    int temp=End-start+1;
    return s.substr(start,End-start+1);
}
int palindrome(string s,int left,int right)
{
    int sum=0;
    while(1)
    {
        if(s[left]==s[right] && left>=0 && right<s.size())
        {
            if(temp.find(s.substr(left,right-left+1))>temp.size())
            {
                temp+=s.substr(left,right-left+1);
                temp+=" ";
                sum++;
            }
            left--;
            right++;
        }
        else return sum;
    }
}
int main()
{
    string s;
    while(getline(cin,s))
    {
        temp.clear();
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            ans+=palindrome(s,i,i);
            if(s[i]==s[i+1])ans+=palindrome(s,i,i+1);
        }
        cout<<"The string '"<<s<<"' contains "<<ans<<" palindromes."<<endl;
    }
    return 0;
}

2014年8月13日 星期三

[UVA] 355 - The Bases Are Loaded

/*20140813 hanting*/
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
string h="0123456789ABCDEF";
string itoa(long long N,int base)
{
    char s[1000];
    int a[1000];
    int i=0;
    while(N>=base)
    {
        a[i++]=N%base;
        N/=base;
    }
    a[i]=N;
    for(int j=0;j<=i;j++)
    {
        s[j]=h[a[i-j]];
    }
    s[++i]=0;
    string str=s;
    return str;
}
long long strtoDec(char* N,int base)
{
    long long a=0;
    for(int i=0;i<strlen(N);i++)
    {
        int temp=h.find(N[strlen(N)-1-i]);
        a+=temp*pow((double)base,i);
    }
    return a;
}
int main()
{
    int base1,base2;
    char N[1000];
    while(cin>>base1>>base2>>N)
    {
        int Continue=0;
        for(int i=0;i<strlen(N);i++)
        {
            if(h.find(N[i])>=base1)
            {
                Continue=1;
                cout<<N<<" is an illegal base "<<base1<<" number"<<endl;
                break;
            }
        }
        if(Continue) continue;
        long long int N_in_Base10;
        N_in_Base10=strtoDec(N,base1);///strtol只能用int範圍
        cout<<N<<" base "<<base1<<" = "<<itoa(N_in_Base10,base2)<<" base "<<base2<<endl;
    }
    return 0;
}

2014年8月12日 星期二

[UVA] 389 - Basically Speaking

/*20140812 hanting*/
#include <iostream>
#include <cstdlib>
#include<cstring>
#include <vector>
#include <iomanip>
using namespace std;
void itoa(int base,int a,char *s)
{
    vector<int> temp;
    char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    while(a>=base)
    {
        temp.push_back(a%base);
        a/=base;
    }
    temp.push_back(a);
    int Size=temp.size();
    for(int i=0;i<Size;i++)
    {
        s[i]=hex[temp.back()];
        temp.pop_back();
    }
    s[Size]=0;
}
int main()
{
    char s[100];
    while(cin>>s)
    {
        int fromBase,toBase;
        cin>>fromBase>>toBase;
        int from;
        from=strtol(s,NULL,fromBase);
        itoa(toBase,from,s);
        if(strlen(s)<=7)
            cout<<setw(7)<<s<<endl;
        else
            cout<<setw(7)<<"ERROR"<<endl;
    }
    return 0;
}

2014年8月6日 星期三

[UVA] 482 - Permutation Arrays

/*20140807 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int N;
    int blank=0;
    cin>>N;
    while(N--)
    {
        if(blank) cout<<endl;
        vector<int> a;
        do
        {
            int temp;
            cin>>temp;
            a.push_back(temp);
        }while(cin.get()!='\n');
        vector<string> b;
        do
        {
            string temp;
            cin>>temp;
            b.push_back(temp);
        }while(cin.get()!='\n');
        vector<string> ans(a.size());
        for(int i=0;i<a.size();i++)
        {
            ans[a[i]-1]=b[i];
        }
        for(int i=0;i<a.size();i++)
        {
            cout<<ans[i]<<endl;
        }
        blank=1;
    }
    return 0;
}

[UVA] 11204 - Musical instruments

/*20140806 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int m,n;
        cin>>m>>n;
        vector<int> a(m);
        for(int i=0;i<n;i++)
        {
            int temp;
            for(int j=0;j<m;j++)
            {
                cin>>temp;
                if(temp==1) a[j]++;

            }
        }


        int ans=1;
        for(int i=0;i<m;i++)
        {
            if(a[i])ans*=a[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}

2014年7月29日 星期二

[UVA] 627 - The Net

/*20140729 hanting*/
#include <iostream>
#include <sstream>
using namespace std;
void run(int a[][1000],int,int);
int router_num;
int main()
{
    while(cin>>router_num)
    {
        cout<<"-----"<<endl;
        int Net[router_num+2][1000];
        for(int i=0;i<router_num+2;i++)
            for(int j=0;j<router_num+2;j++)
                Net[i][j]=0;
        int ID,temp;
        char c;
        for(int i=0;i<router_num;i++)
        {
            cin>>ID;
            string s;
            getline(cin,s);
            if(s.size()==1) continue;
            istringstream sin(s);
            char c;
            while(sin>>c)
            {
                sin>>temp;
                Net[ID][temp]=1;
            }
        }
        int connect_num;
        cin>>connect_num;
        int starting,ending;
        for(int i=0;i<connect_num;i++)
        {
            cin>>starting>>ending;
            run(Net,starting,ending);
        }
    }
    return 0;
}
void run(int a[][1000],int starting,int ending)
{
    int tempa[router_num+2][router_num+2];
    for(int i=0;i<router_num+2;i++)
        for(int j=0;j<router_num+2;j++)
            tempa[i][j]=a[i][j];
    int b[100][1000]={starting};
    int m,n=1;
    int i;
    for(i=1;i>=0;i++)
    {
        m=n;
        n=0;
        for(int j=0;j<m;j++)
        {
            int ID=b[i-1][j];
            for(int k=1;k<=router_num;k++)
            {
                if(tempa[ID][k])
                {
                    b[i][n++]=k;
                    if(k==ending)
                    {
                        m=0;
                        break;
                    }
                    tempa[ID][k]=0;
                }
            }
        }
        if(!n)
        {
            cout<<"connection impossible"<<endl;
            return;
        }
        if(!m) break;
    }
    int temp=ending;
    int route[1000]={temp};
    int con=0;
    for(int j=i-1;j>=0;j--)
    {
        for(int k=0;k>=0;k++)
        {
            int ID=b[j][k];
            if(a[ID][temp])
            {
                temp=ID;
                route[con++]=temp;
                break;
            }
        }
    }
    for(int i=con-1;i>=0;i--)
    {
        cout<<route[i]<<" ";
    }
    cout<<ending<<endl;
}

2014年7月28日 星期一

[UVA] 1225 - Digit Counting

/*20140728 hanting*/
#include <iostream>
using namespace std;
void count(int *a,int i)
{
    while(i)
    {
        a[i%10]++;
        i/=10;
    }
}
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int n;
        cin>>n;
        int a[10]={0};
        for(int i=1;i<=n;i++)
        {
            count(a,i);
        }
        for(int i=0;i<10;i++)
        {
            cout<<a[i]<<(i!=9 ? ' ':'\n');
        }
    }
    return 0;
}

2014年7月27日 星期日

[UVA] 11687 - Digits

/*20140728 hanting*/
#include <iostream>
#include <sstream>
using namespace std;
int dcount(long long int a)
{
    int temp=0;
    if(!a) return 1;
    while(a)
    {
        a/=10;
        temp++;
    }
    return temp;
}
int main()
{
    string s;
    long long int a;
    while(cin>>s && s!="END")
    {
        stringstream ss;
        ss<<s;
        ss>>a;
        int x1=a,x2=dcount(a);
        int con=0;
        while(x1!=x2)
        {
            x1=x2;
            x2=dcount(x2);
            con++;
        }
        cout<<++con<<endl;
    }
    return 0;
}

[UVA] 825 - Walking on the Safe Side

/*20140727 hanting*/
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
int main()
{
    int N;
    cin>>N;
    int blankline=0;
    while(N--)
    {
        if(blankline) cout<<endl;
        int w,e;
        cin>>w>>e;
        int a[500][500]={1};
        int temp,temp2;
        for(int i=0;i<w;i++)
        {
            cin>>temp;
            string s;
            getline(cin,s);
            istringstream sin(s);
            while(sin>>temp2)
            {
                a[temp-1][temp2-1]=-1;
            }
        }

        for(int i=0;i<w;i++)
        {
            for(int j=0;j<e;j++)
            {
                if(a[i][j]==-1) continue;
                if(a[i-1][j]!=-1 && i)
                {
                    a[i][j]+=a[i-1][j];
                }
                if(a[i+1][j]!=-1)
                {
                    a[i][j]+=a[i+1][j];
                }
                if(a[i][j-1]!=-1 && j)
                {
                    a[i][j]+=a[i][j-1];
                }
                if(a[i][j+1]!=-1)
                {
                    a[i][j]+=a[i][j+1];
                }
            }
        }
        cout<<a[w-1][e-1]<<endl;
        blankline=1;
    }
    return 0;
}

2014年7月24日 星期四

[UVA] 294 - Divisors

/*20140725 hanting*/
#include <iostream>
using namespace std;
int prime[10000];
int div(int N)
{
    int DivSum=1;
    for(int i=0;N!=1;i++)
    {
        int x=0;
        if(prime[i]==0)
        {
            return DivSum*2;
        }
        while(N%prime[i]==0)
        {
            x++;
            N/=prime[i];
        }
        DivSum*=x+1;
    }
    return DivSum;
}
int main()
{
    int Num[50000]={0};
    int x=0;
    for(int i=2;i<50000;i++)
    {
        if(Num[i]==0)
        {
            prime[x++]=i;
            for(int j=i;j<50000;j+=i)
            {
                Num[j]=1;
            }
        }
    }
    int N;
    cin>>N;
    while(N--)
    {
        int m,n;
        int num;
        int MaxDiv=0;
        cin>>m>>n;
        for(int i=m;i<=n;i++)
        {
            int Div=div(i);
            if(Div>MaxDiv)
            {
                MaxDiv=Div;
                num=i;
            }
        }
        cout<<"Between "<<m<<" and "<<n<<", "<<num<<" has a maximum of "<<MaxDiv<<" divisors."<<endl;
    }
    return 0;
}

2014年7月23日 星期三

[UVA] 10465 - Homer Simpson

/*20140723 hanting*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int m,n,t;
    while(cin>>m>>n>>t)
    {
        if(m>n) swap(m,n);
        if(t<m)/*it's possible that Homer can't eat anything*/
        {
            cout<<0<<" "<<t<<endl;
            continue;
        }
        vector<int> a(11000);
        for(int j=0;j<11000;j+=n)
        {
            for(int i=j;i<11000;i+=m)
            {
                if(a[i]==0)a[i]=(i-j)/m+j/n;
            }
        }
        if(a[t])cout<<a[t]<<endl;
        else
        {
            for(int i=0;i<t;i++)
            {
                if(a[t-i])
                {
                    cout<<a[t-i]<<" "<<i<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}

2014年7月22日 星期二

[UVA] 10189 - Minesweeper

/*20140722 hanting*/
#include <iostream>
using namespace std;
int main()
{
    int n,m;
    int times=0;
    while(cin>>n>>m ,n+m)
    {
        char c[200][200]={0};
        int a[200][200]={0};
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>c[i][j];
                if(c[i][j]=='*')
                {
                    for(int x=0;x<3;x++)
                    {
                        for(int y=0;y<3;y++)
                        {
                            a[i-1+x][j-1+y]++;
                        }
                    }
                }
            }
        }
        if(times!=0) cout<<endl;
        cout<<"Field #"<<++times<<":"<<endl;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(c[i][j]=='*') cout<<'*';
                else cout<<a[i][j];
            }
            cout<<endl;
        }
    }
    return 0;
}

2014年7月20日 星期日

[UVA] 11185 - Ternary

/*20140721 hanting*/
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
void Itoa(int N,char *s,int ary);
int main()
{
    int N;
    char s[25];
    while(cin>>s && s[0]!='-')
    {
        char ans[25];
        for(int i=0;i<25;i++) ans[i]='-';
        N=atoi(s);
        Itoa(N,ans,3);
        cout<<ans<<endl;
    }
    return 0;
}
void Itoa(int N,char *ans,int ary)
{
    int i=0;
    for(i=0;i<25;i++)
    {
        ans[i]=(N%ary)+48;
        N/=ary;
        if(N==0) break;
    }
    reverse(ans,ans+i+1);
    ans[i+1]=0;
}

2014年7月19日 星期六

[UVA] 10473 - Simple Base Conversion

/*20140720 hanting*/
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
int main()
{
    string s;
    while(getline(cin,s) && s[0]!='-')
    {
        stringstream ss;
        long long int a;
        if(s[1]=='x')
        {
            ss<<s;
            ss>>hex>>a;
            cout<<dec<<a<<endl;
        }
        else
        {
            ss<<s;
            ss>>a;
            cout<<"0x"<<hex<<uppercase<<a<<endl;
        }
    }
    return 0;
}

2014年6月7日 星期六

[UVA] 160 - Factors and Factorials

/*20140608 hanting*/
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
    int prime[10000];
    int num[50000]={0};
    int x=0;
    for(int i=2;i<50000;i++)
    {
        if(num[i]==0)
        {
            prime[x++]=i;
            for(int j=i+i;j<50000;j+=i)
            {
                num[j]=1;
            }
        }
    }
    long long N;
    while(cin>>N && N)
    {
        cout<<setw(3)<<N<<"! =";
        int arr[101]={0};/*arr[2]=3 代表 質數2是3次方*/
        while(N!=1)/*從N開始一直到1*/
        {
            int tempN=N;
            /*質因數分解*/
            for(int i=0;i<100;i++)
            {
                while(tempN%prime[i]==0)
                {
                    arr[ prime[i] ]++;
                    tempN/=prime[i];
                }
            }
            N--;
        }
        int temp;
        for(int i=99;i>=0;i--)
        {
            if(arr[i]!=0)
            {
                temp=i;
                break;
            }
        }
        int con=0;
        for(int i=2;i<=temp;i++)
        {
            if(num[i]==0)
            {
                cout<<setw(3)<<arr[i];
                con++;
                if(i==temp)
                {
                    cout<<endl;
                    break;
                }
                if(con==15)
                {
                    cout<<endl;
                    for(int i=0;i<6;i++) cout<<" ";
                    con=0;
                }

            }
        }
    }
    return 0;
}

2014年5月23日 星期五

[UVA] 562 - Dividing coins

/*20140523 hanting*/
#include <iostream>
#include <cstdlib>
using namespace std;
int store[1000000]={0};
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int m;
        cin>>m;
        int a[m];
        int sum=0;
        int board[50001]={1};
        for(int i=0;i<m;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        int x=1;
        int mini=sum;
        for(int i=0;i<m;i++)
        {
            int store_size=x;
            for(int j=0;j<store_size;j++)
            {
                int temp=a[i]+store[j];
                if(board[temp]==0)
                {
                    board[temp]=1;
                    store[x]=temp;
                    mini=min(mini,abs(temp-(sum-temp)));
                    x++;
                }
            }
        }
        cout<<mini<<endl;
    }
    return 0;
}

2014年5月22日 星期四

[UVA] 11150 - Cola

/*20140522 hanting*/
#include <iostream>
using namespace std;
int main()
{
    int N;
    while(cin>>N)
    {
        cout<<N+N/2<<endl;
    }
    return 0;
}

2014年5月13日 星期二

[UVA] 10252 - Common Permutation

/*20140513 hanting*/
#include <iostream>
using namespace std;
int main()
{
    string s1,s2;
    while(getline(cin,s1))
    {
        int a[26]={0};
        int b[26]={0};
        for(int i=0;i<s1.size();i++)
        {
            a[(int)s1[i]-97]++;
        }
        getline(cin,s2);
        for(int i=0;i<s2.size();i++)
        {
            b[(int)s2[i]-97]++;
        }
        for(int i=0;i<26;i++)
        {
                for(int j=0;j<a[i] && j<b[i];j++)
                    cout<<(char)(i+97);
        }
        cout<<endl;
    }

    return 0;
}

[UVA] 10050 - Hartals

/*20140513 hanting*/
#include <iostream>
using namespace std;
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int D;
        cin>>D;//天數
        bool Days[10000]={0};
        int P;
        cin>>P;//政黨數
        int Party[P];
        for(int i=0;i<P;i++)
        {
            cin>>Party[i];
        }
        for(int i=0;i<P;i++)
        {
            for(int j=Party[i]-1;j<D;j+=Party[i])
            {
                Days[j]=1;
            }
        }
        int count=0;
        for(int i=0;i<D;i++)
        {
            if(i%7!=5 && i%7!=6 &&Days[i]==1)
            {
                count ++ ;
            }
        }
        cout<<count<<endl;
    }
    return 0;
}

2014年5月1日 星期四

[UVA] 12241 - Digits Count

題目連結
/*20140501 hanting*/
#include <iostream>
using namespace std;
void p(int num,int a[])
{
    int ten=1;
    int temp=num;
    while(num)
    {
        for(int i=0;i<num%10;i++)
        {
            a[i]+=ten;
        }
        for(int i=0;i<10;i++)
        {
            a[i]+=ten*(num/10);
        }
        a[0]-=ten;
        a[num%10]+=(temp%ten)+1;
        ten*=10;
        num/=10;
    }
}
int main()
{
    int a,b;
    while(cin>>a>>b && a+b)
    {
        int Num[10]={0};
        p(a-1,Num); /*計算0到a的0~9個有幾個*/
        for(int i=0;i<10;i++) Num[i]*=-1;   /* 所求= 0~b - 0~(a-1) */
        p(b,Num);   /*計算0到b的0~9個有幾個*/
        for(int i=0;i<10;i++)
        {
            cout<<Num[i]<<(i==9 ? '\n': ' ');
        }
    }
    return 0;
}
================================
================================
心血來潮又來寫一次重新推出自己的公式
又一個rank 1 超夢是最強的神奇寶貝
/* 題目: UVa 12241 - Digits Count
 * Language: C++
 * Created on: 2016年8月1日
 *   Author: hanting
 */
#include <iostream>
#include <cstdio>
using namespace std;
void digitCount(int *digit, int n)
{
    int tmp = n;
    int base = 1;
    while(tmp)
    {
        if(n >= base)
            digit[0] -= base;
        digit[tmp%10] += n%base + 1;
        int t = tmp%10;
        for(int i = 0; i < t; i++)
            digit[i] += base;
        tmp /= 10;
        for(int i = 0; i < 10; i++)
        {
            digit[i] += tmp*base;
        }
        base *= 10;
    }
}
int main()
{
    int a, b;
    while(scanf("%d%d", &a, &b) == 2 and a+b)
    {
        int digit[10] = {0};
        int digit2[10] = {0};
        digitCount(digit, a-1);
        digitCount(digit2, b);
        for(int i = 0; i < 9; i++)
        {
            //cout << digit[i] << " ";
            printf("%d ", digit2[i]-digit[i]);
        }
        //cout << digit[9] << endl;
        printf("%d\n", digit2[9]-digit[9]);
    }
    return 0;
}

2014年4月23日 星期三

[UVA] 10642 - Can You Solve It?

/*20140423 hanting*/
#include <iostream>
using namespace std;
int main()
{
    int N;
    cin>>N;
    for(int times=1;times<=N;times++)
    {
        int x[2],y[2];
        for(int i=0;i<2;i++) cin>>x[i]>>y[i];
        int t1=0,t2=0;
        for(int i=1;i<=x[0]+y[0];i++)
        {
            t1+=i;
        }
        t1+=x[0];
        for(int i=1;i<=x[1]+y[1];i++)
        {
            t2+=i;
        }
        t2+=x[1];
        int ans=t2-t1;
        cout<<"Case "<<times<<": "<<ans<<endl;
    }
    return 0;
}

2014年4月19日 星期六

[UVA] 10908 - Largest Square

/*20140419 hanting*/
#include <iostream>
using namespace std;
int main()
{
    int t,m,n,q;
    cin>>t;
    while(t--)
    {
        cin>>m>>n>>q;
        char ch[102][102]={'\0'};//初始
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>ch[i][j];
            }
        }
        cout<<m<<" "<<n<<" "<<q<<endl;
        while(q--)
        {
            int r=0,c=0;
            cin>>r>>c;
            char center=ch[r][c];
            int ans=1;
            for(int k=3;k>=0;k+=2)//邊長
            {
                for(int i=0;i<k;i++)//從中心左上角開始跑k*k個字元
                {
                    for(int j=0;j<k;j++)
                    {
                        if(ch[r-((k-1)/2)+i][c-((k-1)/2)+j]!=center)
                        {
                            i=k;
                            ans=k-2;k=-3;
                            break;
                        }
                    }
                }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

[UVA] 10170 - The Hotel with Infinite Rooms

/*20140419 hanting*/
#include <iostream>
using namespace std;
int main()
{
    long long s,d;
    while(cin>>s>>d)
    {
        long long i;
        long long sum=0;
        for(i=s;sum+i<d;i++)
        {
            sum+=i;
        }
        cout<<i<<endl;
    }
    return 0;
}

2014年3月24日 星期一

[UVA] 11689 - Soda Surpler

/*20140325 hanting*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int e,f,c;
        cin>>e>>f>>c;
        e+=f;
        int ans=0;
        while(e/c)
        {
            ans+=e/c;
            e=e/c+e%c;
        }
        cout<<ans<<endl;
    }
    return 0;
}

[UVA] 11192 - Group Reverse

/*20140325 hanting*/
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int N;
    while(cin>>N && N!=0)
    {
        string s;
        string ans="";
        cin>>s;
        for(int i=0;i<s.size();i+=(s.size()/N))
        {
            string ss=s.substr(i,(s.size()/N));
            reverse(ss.begin(),ss.end());
            ans+=ss;
        }
        cout<<ans<<endl;
    }
    return 0;
}

[UVA] 10042 - Smith numbers

/*20140325 hanting*/
#include <iostream>
#include <cmath>
using namespace std;
int m=0;
int Prime[10000];
int num_total(int num)
{
    int total=0;
    while(num)
    {
        total+=num%10;
        num/=10;
    }
    return total;
}
bool prime(int num)
{
    for(int i=0;i<m && Prime[i]<=ceil(sqrt(num));i++)
    {
        if(num%Prime[i]==0 && num!=2)
        {
            return 0;
            break;
        }
        if(Prime[i+1]>ceil(sqrt(num)))
        {
            return 1;
            break;
        }
    }
}
int SmithNumber_total(int num)
{
    int total=0;
    for(int i=0;i<m && i<=num;i++)
    {
        while(num%Prime[i]==0)
        {
            total+=num_total(Prime[i]);
            num/=Prime[i];
        }
        if(prime(num)==1)
        {
            total+=num_total(num);
            break;
        }
    }
    return total;
}
int main()
{
    int Num[50000]={0};
    for(int i=2;i<50000;i++)
    {
        if(Num[i]==0)
        {
            Prime[m++]=i;
        }
        for(int j=i;j<50000;j+=i)
        {
            Num[j]=1;
        }
    }
    int N;
    cin>>N;
    while(N--)
    {
        int num;
        cin>>num;
        while(++num)
        {
            if(prime(num)!=1)
            {
                if(SmithNumber_total(num)==num_total(num))
                {
                    cout<<num<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}