(Timus) 1009. K-based Numbers

0
/*
user: php
link: http://acm.timus.ru/problem.aspx?space=1&num=1009
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 17
#define type int

int N, k;
type dp[MAXX];
type sp_dp[MAXX];

type sp_rec(int n);
type rec(int n)
{
    type &ret = dp[n];
    if(ret != -1) return ret;

    return ret = rec(n-1)*k + sp_rec(n-1);
}

type sp_rec(int n)
{
    type &ret = sp_dp[n];
    if(ret != -1) return ret;

    ret = rec(n-1) * k;

    return ret;

}








int main()
{

    cin>>N>>k;
    k--;
    mem(dp, -1);
    mem(sp_dp, -1);

    dp[1] = sp_dp[1] = k;

    cout<<rec(N);




    return 0;
}


(timus) 1078. Segments

0
/*
link: http://acm.timus.ru/problem.aspx?space=1&num=1078
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define MAXX 22

#define MAXX 10002

using namespace std;

struct DATA{

    int id, left, right;
};

bool comp(DATA a, DATA b)
{
    if(a.left < b.left)
    {
        return true;
    }
    else if(a.left == b.left)
    {
        return a.right < b.right;
    }
    else
    {
        return false;
    }
}


int cnt;

DATA ara[MAXX];

int LisLen = 0;
int L[MAXX];

void NlogK()
{
    int temp = cnt+1;
    int I[temp];
    I[0] = INF;

    FOR(i, 1, temp)
    {
        I[i] = -INF;
    }

    int left, u, right, mid;

    loop(i, cnt)
    {
        u = ara[i].right;
        left = 0;
        right = LisLen;


        while( left <= right )
        {
            mid = (left + right)/2;

            if(I[mid] > u)
            {
                left = mid+1;
            }
            else
            {
                right = mid - 1;
            }
        }

        I[left] = u;
        L[i] = left;

        LisLen = max(LisLen, left);
    }


}











int main()
{
    getint(cnt);

    loop(i, cnt)
    {
        ara[i].id = i;
        getint(ara[i].left); getint(ara[i].right);
    }

    sort(ara, ara+cnt, comp);

    NlogK();

    cout<<LisLen<<endl;

    int last_taken = -INF;


    for(int i=cnt-1; i>-1; i--)
    {
        if(L[i] == LisLen && ara[i].right > last_taken)
        {
            pf("%d", ara[i].id + 1);
            LisLen--;
            if(LisLen) pf(" ");
        }
    }
    pf("\n");






}

(timus) 1073. Square Country

0
/*
link: http://acm.timus.ru/problem.aspx?space=1&num=1073
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1000000
#define mod abs
#define pf printf
#define sf scanf

#define MAXX 60002

using namespace std;

int dp[MAXX];
int rec(int remain)
{
    int &ret = dp[remain];
    if(ret != -1) return ret;

    int root = sqrt(remain);

    ret = INF;

    for(int i=1; i<=root; i++)
    {
        ret = min(ret, rec(remain - i*i));
    }
    return ++ret;
}

using namespace std;

int main()
{
    int target;
    getint(target);
    mem(dp, -1);
    dp[0] = 0;

    cout<<rec(target)<<endl;

}

(Timus) 1319. Hotel

0
/*
user: php
time: 0.015 sec
link: http://acm.timus.ru/problem.aspx?space=1&num=1319
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

int grid[101][101];


int main()
{
    int n;
    cin>>n;

    int till;
    int i;


    till = (n *(n+1))/2 + 1;
    int r = 0, c = 0;
    for(i=1; i<till; i++ )
    {
        grid[r][c] = i;
        if(c == 0)
        {
            c = r + 1;
            r = 0;
        }
        else
        {
            c--;
            r++;
        }
    }


    till--;
    r = 0;
    c = 0;

    for(i = n*n; i>till; i--)
    {
        grid[n - r - 1][n - c - 1] = i;
        if(c == 0)
        {
            c = r + 1;
            r = 0;
        }
        else
        {
            c--;
            r++;
        }
    }

    loop(i, n)
    {
        pf("%d", grid[i][n-1]);
        for(int j=n-2; j>-1; j--)
        {
            pf(" %d", grid[i][j]);
        }
        pf("\n");
    }

    return 0;
}






(Timus) 1044. Lucky Tickets. Easy!

0
/*
user: php
time: 0.015 sec
link: http://acm.timus.ru/problem.aspx?space=1&num=1044
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

int cnt[37];
ll res[4];


int main()
{
    res[0] = 10;
    res[1] = 670;



    res[2] = 0;
    loop(i, 10)
    {
        loop(j, 10)
        {
            loop(k, 10)
            {
                cnt[i+j+k]++;
            }
        }
    }


    loop(i, 28)
    {
        res[2] += cnt[i]*cnt[i];
    }



    res[3] = 0;
    loop(i, 37) cnt[i] = 0;

    loop(i, 10)
        loop(j, 10)
            loop(k, 10)
                loop(q, 10)
                    cnt[i+j+k+q]++;





    loop(i, 37)
    {
        res[3] += cnt[i]*cnt[i];
    }

    int n;
    cin>>n;
    n = n/2 - 1;
    cout<<res[n]<<endl;


    return 0;
}






(Timus) 1029. Ministry

0
/*
user: php
time: 0.093 sec
link: http://acm.timus.ru/problem.aspx?space=1&num=1029
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 10000000000
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

struct DATA{
    int r, c;
    void set(int i, int j)
    {
        r = i;
        c = j;
    }
};



ll dp[101][501][2][2];
ll cost[101][501];
DATA path[101][501];
int rows, columns;

ll rec(int r, int c, bool leftused, bool rightused)
{
    ll &ret = dp[r][c][leftused][rightused];
    if(ret != -1) return ret;
    if(r == rows-1) return ret = cost[r][c];

    ret = rec(r+1, c, 0, 0);

    if(leftused == 0 && rightused == 0)
        path[r][c].set(r+1, c);

    if(rightused == 0 && c+1 < columns )
    {
        if(rec(r, c+1, 1, 0) < ret)
        {
            ret = dp[r][c+1][1][0];
            if(leftused == 0)
                path[r][c].set(r, c+1);
        }
    }

    if(leftused == 0 && 0 < c )
    {
        if(rec(r, c-1, 0, 1 ) < ret )
        {
            ret = dp[r][c-1][0][1];
            if(rightused == 0)
                path[r][c].set(r, c-1);
        }
    }


    ret += cost[r][c];

    return ret;

}



int main()
{

    ll mincost;
    mem(dp, -1);
    mem(path, -1);
    cin>>rows>>columns;

    loop(i, rows)
    {
        loop(j, columns)
        {
            cin>>cost[i][j];
        }
    }

    mincost = INF;
    DATA start;
    start.r = 0;
    loop(i, columns)
    {
        if(rec(0, i, 0, 0) < mincost)
        {
            start.c = i;
            mincost =   dp[0][i][0][0];
        }
    }



    while(start.r != rows-1)
    {
        cout<<start.c+1<<" ";
        start.set(path[start.r][start.c].r, path[start.r][start.c].c);
    }
    cout<<start.c + 1<<endl;


    return 0;
}


(Timus) 1017. Staircases

1
/*
user: php
time: --
link: http://acm.timus.ru/problem.aspx?space=1&num=1017
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

ll dp[501];


int main()
{
    dp[0] = 1;
    int maxpos = 0;
    int sum;
    for(int i=1; i<501; i++)
    {
        for(int j=maxpos; j>-1; j--)
        {
            sum = j + i;
            if(sum < 501)
            {
                dp[sum] += dp[j];
                maxpos = max(maxpos, sum);
            }
        }
    }


    int n;
    cin>>n;
    cout<<dp[n] - 1<<endl;

    return 0;
}