国庆集训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;
}