国庆集训1

国庆集训1

A:全 1 子矩阵:
题意:判断一个矩阵里面的1是不是一个矩阵

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;

int main(void)
{
      int n,m;
      char k;
      while(cin>>n>>m){
            int num=0,b1=0,b2=0,a1=105,a2=105;
            for(int i=1;i<=n;i++){
                  for(int j=1;j<=m;j++){
                        cin>>k;
                        if(k=='1'){
                              num++;
                              a1=min(i,a1);
                              a2=min(j,a2);
                              b1=max(b1,i);
                              b2=max(b2,j);
                        }
                  }
            }
            if(num==((b1-a1+1)*(b2-a2+1))) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
      }
      return 0;
}

B:组合数
题意:求C n 取 k
找最小的乘法长度来求

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;

int main(void)
{
      ll  k=1;ll n;
      long double ans=1;
      ll big=1e18;
      while(cin>>n>>k){
            ans=1;
            k=min(k,n-k);
            for(int i=1;i<=k;i++){
                  ans=ans*(n+1-i)/i;
                  if(ans>big) break;
            }
            if(ans>big) cout<<big<<endl;
            else cout<<(ll)ans<<endl;
      }
      return 0;
}

E:Numbers:
题意:给一个string数字串,找出原来可能的组合数目
注意题目的,拥有不同的数!!

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;
int v[100];
string s;
int len;
int dfs(int i)
{
      if(i==len) return 1;
      int x=s[i]-'0';
      ll ans=0;
      if(v[x]==0){
            v[x]=1;
            ans+=dfs(i+1);
            v[x]=0;
      }
      if(i<len-1&&s[i]!='0'){
            x=x*10+s[i+1]-'0';
            if(v[x]==0){
                  v[x]=1;
                  ans+=dfs(i+2);
                  v[x]=0;
            }
      }
      return ans;
}
int main(void)
{
      while(cin>>s){
            memset(v,0,sizeof v);
            len=s.length();
            cout<<dfs(0)<<endl;
      }
      return 0;
}

F: 4 Buttons:
题目大意:于平面上的原点 (0,0),有四种操作:向右最多移动a步,向上最多移动b步,向左最多移动c步,向下最多移动d步。问执行 n 次操作可以到达多少个不同的点。
数学题:
在第一象限内:
第一次操作到达x轴上区间 [1, a],第2次到第n次竖直方向上能到达 [1, (n-1)b)] ,共 a
(n-1)b个点;
两次操作到达x轴上区间 [a+1, 2a], 第2次到第n次竖直方向上能到达 [1, (n-2)b)] ,共 a
(n-2)b个点;
···
n-1次操作到达x轴上区间 [(n-2)a+1, (n-1)a], 第n-1次到第n次竖直方向上能到达 [1, b] ,共 a*b个点;
// n 次操作到达x轴上最远的a个点 [(n-1)a+1, na]。
所以答案, 1 + n(a + b + c + d) + n(n-1)/2 * (ab + bc + cd + ad) 。**

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;

int main(void)
{
      ll mod=1000000007;
      ll n,a,b,c,d;
      while(cin>>n>>a>>b>>c>>d){
            cout<<(ll)(((n-1)*n/2%mod*(a*b%mod+ b*c%mod + c*d%mod + a*d%mod)
                        %mod)+n*(a+b+c+d)%mod+1)%mod<<endl;
      }
      return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值