CF #309 (Div. 2)

A. Kyoya and Photobooks
题目大意就是给你一个字符串,让你在任意一个位置插入一个a-z的字母,问你一共有几种方法。
可以找规律,假设字符串长度为n,那么一共有n+1个位置可以任意插入26个字母,则26*(n+1),又因为其中有n个是重复的,比如在a前后插入一个小a后,为aa和aa,重复了一个。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-10
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
#define ll __int64
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
int n,m;
#define N 200010
char ch[N];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    int k;
    while(scanf("%s",ch)!=EOF){
        int len = strlen(ch);
        printf("%d\n",26*(len+1)-len);
    }
return 0;
}

B. Ohana Cleans Up
给你一个01矩阵,每次对一列进行操作,操作的结果是把0变为1,把1变为0。问你可以得到最多几个全为1的行。
这个其实仔细想想就明白了。。如果有两个全为1的行。。那么它们肯定本来就一模一样,,因为每次对列操作时会同时操作到这两个行,所以如果它们本来不一样,那么不可能操作完以后变成两个一模一样的全1行。。。。这个知道了以后就好办了。。直接暴力找下最多有几行是相同的。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-10
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
#define ll __int64
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
int n,m;
#define N 200010
char ch[110][110];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    int k;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)
            sfs(ch[i]);
        int ans=0;
        for(int i=0;i<n;i++){
            int res=1;
            for(int j=0;j<n;j++){
                int flag=1;
                if(j==i) continue;
                for(int k=0;k<n;k++){
                    if(ch[j][k] != ch[i][k]) {
                        flag=0;
                        break;
                    }
                }
                if(flag) res++;
            }
            ans = Max(ans,res);
        }
        printf("%d\n",ans);
    }
return 0;
}

C. Kyoya and Colored Balls
C题是数学题。。数学题不太会。理解了下别人的代码。
是个排列组合的题目,一共有k种颜色,涂满n个球,然后每种颜色有ci个球,题目中要求对于每种颜色的最后一个球,它一定要在下一种颜色最后一个球的前面。问这样的排列方法一共有几种。
逆着思考。我们先放大的,然后剩下的几个随便放。
比如2 2 2,那么我们就先放最后两个球中的一个,放好以后,还剩5个球,最后中的另外一个球就可以随便放。之后重复这个过程即可。那么公式就是c[sum-1][a[i]-1],sum是球的总数,a[i]是第i种颜色的球个数,我们倒着计算即可。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<limits.h>
#include<map>
//#define ONLINE_JUDGE
#define eps 1e-10
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a)
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
#define ll __int64
const double PI=acos(-1.0);
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
using namespace std;
int n,m;
#define N 1010
#define Mod 1000000007
ll c[N][N];
void Init(){
    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++){
            if(i == j)
                c[i][j] = 1%Mod;
            else
            c[i][j] = (c[i-1][j]+c[i-1][j-1])%Mod;
        }
    }
}
int a[N];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
#endif
    Init();
    while(scanf("%d",&n)!=EOF){
        int sum=0;
        for(int i=0;i<n;i++){
            sf(a[i]);
            sum += a[i];
        }
        ll ans=1;
        for(int i=n-1;i>=0;i--){
            ans = ans*c[sum-1][a[i]-1]%Mod;
            sum -= a[i];
        }
        printf("%I64d\n",ans);
    }
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值