2014多校联合-第八场

1001:2048

很明显,一开始看错题了。。。sad

这题目我感觉挺卡时间的。。。

dp[i][j]:在选择2^i的时候,选择的和为j*2^i到(j+1)*2^i-1时候的情况。

#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define LL __int64
#define lcm(a,b) (a*b/gcd(a,b))
#define mod 998244353
#define maxn 110000
//O(n)求素数,1-n的欧拉数
int num[21];
LL dp[15][2100];
LL jie[maxn];
LL use[15][2100];
int n;
int add(int x)
{
    if(x==0)return 20;
    int c=0;
    while(x!=1)
    {
        if(x&1)return 20;
        x=x>>1;
        c++;
    }
    return c;
}
LL q_mod(LL a,LL b,LL n)
{
    LL ret=1;
    LL tmp=a%n;
    while(b)
    {
        //基数存在
        if(b&0x1) ret=ret*tmp%n;
        tmp=tmp*tmp%n;
        b>>=1;
    }
    return ret;
}
LL select(int n,int m)
{
    if(m>n)return 0;
    LL ans=jie[n];
    ans=(ans*q_mod((jie[m]*jie[n-m])%mod,mod-2,mod))%mod;
    return ans;
}
void select()
{
    for(int i=1;i<=11;i++)
    {
        for(int j=0;j<2048;j++)
        {
            use[i][j]=select(num[i-1],j);
        }
    }
}
void dos()
{
    select();
    for(int j=0;j<2048;j++)dp[1][j]=use[1][j];
    for(int i=2; i<12; i++)
    {
        int cnt=1<<(12-i);
        for(int j=0; j<cnt; j++)
        {
            for(int k=0; k<=j*2+1; k+=2)
            {
                dp[i][j]+=((dp[i-1][k]+dp[i-1][k+1])*use[i][j-k/2])%mod;
            }
            dp[i][j]%=mod;
        }
    }
    LL ans=0;
    ans=q_mod(2,num[20],mod);
    LL ps=(dp[11][0]+dp[11][1])%mod;
    ps=q_mod(2,n-num[20],mod)-ps;
    ps=(ps+mod)%mod;
    ans=(ans*ps)%mod;
    cout<<ans<<endl;
}
int main()
{
    //freopen("1001.in","r",stdin);
    //freopen("10011.out","w",stdout);
    int cas=0;
    int x;
    jie[0]=1;
    for(int i=1; i<maxn; i++)jie[i]=(jie[i-1]*i)%mod;
    while(~scanf("%d",&n)&&n)
    {
        memset(num,0,sizeof(num));
        memset(dp,0,sizeof(dp));
        cas++;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&x);
            num[add(x)]++;
        }
        printf("Case #%d: ",cas);
        dos();
    }
    return 0;
}

1004:Kingdom

超级后悔当时没有看这个题。。。。明显水题嘛。。。。

相当于拓扑排序。。

每次弹出入度最小的点。根本没有-1的情况。。。被骗了。。。

#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define LL long long
#define lcm(a,b) (a*b/gcd(a,b))
//O(n)求素数,1-n的欧拉数
#define maxn 505
int mp[maxn][maxn];
vector<int>vec;
int du[maxn];
int n;
void tuopu()
{
    vec.clear();
    int i;
    while(1)
    {
        int now=0;
        int minn=9999;
        for(i=1;i<=n;i++)
        {
            if(du[i]>=0&&minn>du[i])
            {
                now=i;
                minn=du[i];
            }
        }
        if(now==0)break;
        vec.push_back(now);
        du[now]=-1;
        for(i=1;i<=n;i++)
        {
            if(mp[i][now])du[i]--;
        }
    }
    if(vec.size()<n)cout<<"-1"<<endl;
    else
    {
        for(int i=vec.size()-1;i>=0;i--)
        {
            printf("%d",vec[i]);
            if(i!=0)printf(" ");
            else puts("");
        }
    }
}
char str[11001];
int main()
{
    LL p,g,y;
   //freopen("1004.in","r",stdin);
   // freopen("10041.out","w",stdout);
    while(~scanf("%d",&n)&&n)
    {
        memset(du,0,sizeof(du));
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str);
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=str[j-1]-'0';
                if(mp[i][j])du[i]++;
            }
        }
        tuopu();
    }
    return 0;
}

1007:Multiplication table

整场比赛最伤的就是这个题,一开始思路有问题,后来就一直带偏了。。。

很明显,对于不同的数,首位的类别有不同种。

#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define LL long long
#define lcm(a,b) (a*b/gcd(a,b))
//O(n)求素数,1-n的欧拉数
int mp[2][505][505];
vector<int>vec[505];
int ans[505];
int num[505];
int in()
{
    char ch;
    int a = 0;
    while((ch = getchar()) == ' ' || ch == '\n');
    a += ch - '0';
    while((ch = getchar()) != ' ' && ch != '\n')
    {
        a *= 10;
        a += ch - '0';
    }
    return a;
}
int main()
{
   // freopen("1007.in","r",stdin);
   // freopen("10071.out","w",stdout);
    int x,y;
    int cas=0;
    int check[101];
    int n;
    while(~scanf("%d",&n)&&n)
    {
        cas++;
        memset(ans,-1,sizeof(ans));
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                x=in();
                y=in();
                mp[0][i][j]=x;
                mp[1][i][j]=y;
                if(x==y&&x==i&&i==j)
                {
                    ans[0]=i;
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            if(mp[0][i][i]==ans[0]&&mp[1][i][i]!=ans[0]&&mp[1][i][i]==i)
            {
                ans[1]=i;
                break;
            }
        }
        for(int i=0; i<n; i++)
        {
            vec[i].clear();
            for(int j=0; j<n; j++)vec[i].push_back(mp[0][i][j]);
            sort(vec[i].begin(),vec[i].end());
            num[i]=1;
            for(int j=1; j<vec[i].size(); j++)
            {
                if(vec[i][j]!=vec[i][j-1])num[i]++;
            }
            if(num[i]>1)ans[num[i]]=i;
        }
        printf("Case #%d:",cas);
        int leap=0;
        for(int i=0; i<n; i++)
        {
            printf(" %d",ans[i]);
            if(ans[i]==-1)leap=1;
        }
        while(leap)
        {
            cout<<check[110101010110]<<endl;
        }
        cout<<endl;
    }
    return 0;
}

2014多校联合-第八场

时间: 2024-09-29 22:19:57

2014多校联合-第八场的相关文章

2014多校联合-第六场

最近这两场好无奈啊... 今天这场最后30分钟敲1001,压力倍增,虽然思路比较明确,但是代码打起来不怎么容易. 但是还是好在25分钟左右debug结束.提交wa,再提交,依然WA.......最后5分钟,还是没有AC掉. 一开始以为是精度问题,后来才sb的发现原来数组开小了. 在压力环境下保证代码的效率和质量真不是一件容易的事情.不过数组开小了,真是不可原谅. 1001:Map 题目相当于几条链表.把链表排成几行. 然后枚举每一列的状态会被操作多少次. 然后把和累加起来,然后直接除以状态总数.

2014多校联合-第七场

1005: ( Stupid Tower Defense ) 由题意我们很明显可以知道,红色的塔放在最后面是最优的. 假如前i个塔,放j个绿塔,i-j个蓝塔.那么无论前i个塔的顺序怎么放,对后面的塔造成的影响是完全相同的. dp[i][j]:前i个塔,放j个绿塔,能获得的最大价值. dp[i][j]=max(dp[i-1][j-1]+当前塔放绿塔获得的能量值,dp[i-1][j]+当前塔放蓝塔获得的能量值): #include <iostream> #include<stdio.h>

2014多校联合-第五场

1001:Inversion 模版题,求逆序数对.有多少逆序数对,就可以剪掉多少. 1003:Least common multiple 对于每一个子集,lcm为2的a的最大值次方*3的b的最大值次方. 所以我们只需要求出以某个b为b的最大值的时候,a的最大值的分布情况即可. 我们先把b从小到大排序. 对于某一个b,我门只需要求出之前出现过的a比当前a小的数量为x: 那么就可知对于这些a的子集,为2^x个,并且,每个子集a的最大值都为当前a. 我么还需要求出对于大于当前a的a有多少个比a小的数,

2014多校联合训练第一场(组队训练)

这是我.potaty.lmz第二次训练,毕竟经验不足,加上水平不够,导致我们各种被碾压. A - Couple doubi: 这道题是道比较水的数论.但我们都没想出来要怎么做.后来是potaty提议打个表看看,然后lmz打出表后发现了规律.我还没细看,待研究后再补全. D - Task: 这道题一看就知道是个贪心(现在只要是有deadline的题我都觉得是贪心了).虽然想出来了,但还是不会严格证明为什么只要取满足task的且y最小(y相等时x最小)的machine就行了. 我的做法是把所有mac

HDU 5389 Zero Escape(2015年多校联合第八场 动态规划)

题目连接:传送门 题意: 讲一个长度为n的序列分为两组,使得一组的和为A,一组的和为B. 注意这里的和定义为这些数的和的数根. 一个数的数根的计算公式为,root = (x-1)%9+1; 很明显一个正整数的数根是1~9的分析,如果这n个数的数根分成两组使得 一组的数根为A,一组的数根为B那么这两组的数的和的数根等于(A+B)的 数根.因此我们只需要考虑组成其中一个数的情况,然后再最后进行一个 判断即可我们设dp[i][j]表示前i个数组成的数根为j的数目. 注意其中任意一组可以为空. 代码如下

hdu5389 Zero Escape DP+滚动数组 多校联合第八场

Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 56    Accepted Submission(s): 18 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikos

2014多校联合八(HDU 4945 HDU 4946 HDU 4948 HDU 4950 HDU 4951 HDU 4952)

HDU 4945 2048 题意:给你一堆数字  问有几个子集可以拼出2048 思路: 拼数字的规则相当于让数字乘二  所以不是2^i的数字不会拼出2048  那么这些数可选可不选  即为2^cnt种可能 之后只要计算出有几个子集不可能拼出2048即可  不过简单的直接dp是2048*100000的复杂度的  会TLE 所以要变成先枚举元素  再枚举该种元素个数  再枚举2048种状态  然后利用组合求(组合里需要逆元) 为什么这样快?  因为比如枚举2^5这个元素的时候  最多取2^6个  枚

hdu 4865 Peter&amp;#39;s Hobby(2014 多校联合第一场 E)

Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 545    Accepted Submission(s): 237 Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf

2014多校联合第一场

1001:Couple doubi 暴力打表找规律可知,对于任意的p. (1^i+2^i+...+(p-1)^i)%p={ 非0     ,i%(p-1)==0 0        ,  i%(p-1)!=0 } 所以,结果就很显然了. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stdlib.h> #include<c