zoukankan      html  css  js  c++  java
  • 国庆集训Day1

    T1 divide

    题意:

    (n)个数 (a_1, a_2,..., a_n) 有m个数(b_1, b_2,..., b_n)

    (a = a_1 imes a_2\, imes ... imes \,a_n)

    (b = b_1 imes\,b_2 imes\,...\, imes\,b_n)

    判断(a)是否是(b)的倍数

    输入:(n,m)

    输出:(Yes / No)

    做法:就是个一简单的质因数分解

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n, m;
    int a[1010], b[1010];
    int p[3][20]={};
    void divid(int op, int x)
    {
    	if(x == 1) return;
    	if(x == 2) p[op][1]++;
    	if(x == 3) p[op][2]++;
    	if(x == 4) p[op][1] += 2;
    	if(x == 5) p[op][3]++;
    	if(x == 6) {p[op][1]++; p[op][2]++;}
    	return;
    }
    int main()
    {
    	freopen("divide.in","r",stdin);
    	freopen("divide.out","w",stdout);
    	scanf("%d%d", &n, &m);
    	for(int i = 1; i <= n; i++)
    	{
    		scanf("%d", &a[i]);
    		divid(1, a[i]);
    	}
    	for(int i = 1; i <= m; i++)
    	{
    		scanf("%d", &b[i]);
    		divid(2, b[i]);
    	}
    	for(int i = 1; i <= 3; i++)
    	{
    		if(p[1][i] >= p[2][i])continue;
    		else
    		{
    			printf("No
    "); return 0;
    		}
    	}
    	printf("Yes
    ");
    	return 0;
    }
    /*
    样例:
    输入:2 3
         6 6
         1 3 4
    输出:Yes
    */
    

    T2 graph

    题意:

    现在要生成一张n个点的有向图。要求满足:

    1.若有(a-> b)的边,则有(b->a)的边

    2.若有(a->b)的边和(b->c)的边,则有(a->c)的边

    3.至少有一个点没有自环

    求方案数。 由于结果可能较大,结果对(m)取模

    输入:(n,m)

    输出:答案

    做法:

    这道题除了题意比较坑以外,没有什么太大的难点。需要注意的是,按照题意,如果一个点所在的连通块大小大于或等于2,则该点一定有自环。

    我的做法是:设(f[i][0])表示(i)个点自由组合,且每个点都存在自环的方案数

    (f[i][1])表示(i)个点自由组合,且至少有(1)个点没有自环的方案数

    我转移方程的方法有点独特,我是看(1)号点所在的连通块的点的个数进行转移,需要注意的是转移是需要讨论(1)号点是否孤立为一个点,若孤立,则有(1)号点自环和不自环的两种情况,需分别进行讨论,状态转移方程如下:

    (f[i][1]+=f[i - 1][1]\,\,\,\,1)号点孤立且(1)号点存在自环

    (f[i][1] += f[i - 1][1] + f[i - 1][0]\,\,\,\,1)号点孤立且(1)号点不存在自环,则其他点可以自环,可以不自环

    (f[i][1] +=sum_{j=2}^{i} f[i - j][1] imes C_{i-1}^{j-1} \,\,\,\,)计算(1)号点所在的连通块大小为(j)时的方案数

    (f[i][0]+=f[i-1][0]\,\,\,\,1)号点孤立时只能自环

    (f[i][0]+=sum_{j=2}^{i} f[i - j][0] imes C_{i-1}^{j-1} \,\,\,\,)计算(1)号点所在的连通块大小为(j)时的方案数

    组合数用杨辉三角就可以了。

    老师讲的做法是把“第(1)个点”改成“第(i)个点”,其实写法是一样的,只是思路不同而已。

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    #define maxn 2010
    #define ll long long
    int n, mol;
    ll f[maxn][2];//  1:符合题意 0:不符合题意 
    ll C[maxn][maxn];
    int main()
    {
    	freopen("graph.in", "r", stdin);
    	freopen("graph.out", "w", stdout);
    	scanf("%d%d", &n, &mol);
    	for(int i = 0; i <= n; i++) C[i][0] = 1;
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= i; j++)
    		{
    		    C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mol;
    		}
    	}
    /*	for(int i = 0; i <= n; i++)
    	{
    		for(int j = 0; j <= i; j++)
    		printf("C[%d][%d] = %lld ", i, j, C[i][j]);
    		printf("
    ");
    	}
    */
        f[1][1] = 1; f[1][0] = 1;
    	for(int i = 2; i <= n; i++)
    	{
    		f[i][1] = (f[i][1] + f[i - 1][1] + f[i - 1][0] + f[i - 1][1]) % mol;
    		f[i][0] = (f[i][0] + f[i - 1][0]) % mol;
    		for(int j = 2; j < i; j++)
    		{
    //			f[i][1] = (f[i][1] + ( ( ( (C[i - 1][j - 1] * S[j - 1][j - 1]) % mol ) * ( (f[i - j][0] + f[i - j][1]) % mol) ) % mol)) % mol;                                               
    			f[i][1] = (f[i][1] + (C[i - 1][j - 1] * f[i - j][1]) % mol) % mol;
    			f[i][0] = (f[i][0] + (C[i - 1][j - 1] * f[i - j][0]) % mol) % mol;
    		}
    		f[i][0] = (f[i][0] + 1) % mol;
    	}
    //	for(int i = 1; i <= n; i++)
    //	printf("f[%d][0] = %lld f[%d][1] = %lld
    ", i, f[i][0], i, f[i][1]);
    	printf("%lld
    ", f[n][1]);
    	return 0;
    }             
    /*
    样例:
    输入:2 5
    输出:3
    */
    

    T3 生成图

    题意:

    (a=1\,\,\,b=0)

    进行不超过b次操作,每次可以选择一下两种操作之一:

    (1.\,\,b\,\,+=1)

    (2.\,a imes b)

    最后得到一个整数(a),该整数位于([l,r])之间,求最后的(a)有多少种可能

    输入:(l,r,p)

    输出:答案

    做法:经过“观察”,我们发现答案很小,所以我们可以通过计算出所有可能的答案(有质因子超过p则该答案不可能),然后“离散化”就可以求出了,同时再计算需要的最小步数。

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/Akaina/p/11615733.html
Copyright © 2011-2022 走看看