#include <iostream>
using namespace std;
int n;
const int mod=1e9+7;
long long ans=1;
int dir[2][2] = {{0, 1}, {1, 0}};
bool mp[105][105];
int re[105][105];
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> mp[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(!mp[i][j])//如果走得通
re[i][j]=0;
else{
if(i==1&&j==1){
re[i][j]=1;//起点位置路径数设为1
continue;
}
//状态转移方程分3类:
//第一行,第一列,中间
if(i==1&&j!=1){
re[i][j]=re[i][j-1];//如果第一行一直向右走,则右边一格的路径数为左边一格的
continue;
}
if(i!=1&&j==1){
re[i][j]=re[i-1][j];//如果第一列一直向下走,则下边一格的路径数为上边一格的
continue;
}
re[i][j]=(re[i-1][j]%mod+re[i][j-1]%mod)%mod;//中间任意一格走得通的路径数等于这格的上一格和左一个路径数之和
}
}
}
cout<<re[n][n];
}
#include <bits/stdc++.h>
using namespace std;
int n;
int dp[10005];
int A[10005];
int sum;
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> A[i];
}
int res = -1;
for (int i = 1; i <= n; ++i)
{
dp[i] = A[i];//将第i个数字初始化dp[i]
for (int j = 1; j < i; ++j)
{
if (dp[j] + A[i] > dp[i] && A[j] < A[i])//如果前j项的和加上第i项大于当前dp[i]的值且单调递增
dp[i] = dp[j] + A[i];//则将当前dp[i]更新,最终dp[i]表示前i项且包括第i项的最大的上升子序列的和
}
res=max(res,dp[i]);//更新为前i项可能包括第i项的最大的上升子序列的和
}
cout << res;
}
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N=200010;
long long f[N+50][10];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=9;++i)f[0][i]=1;
for(int i=1;i<N;++i)
{
for(int j=1;j<=9;++j)f[i][j-1]=f[i-1][j];//位数为j经过i-1次操作与位数为j-1经过i次操作最后的值相等
f[i][9]=(f[i-1][1]+f[i-1][0])%mod;//位数为9经过i次操作等价于位数为1经过i-1次操作所得的值与位数为0经过i-1次操作所得的值之和,因为9+1=10
}
while(n--)
{
char str[20];
int m,res=0;
scanf("%s %d",&str,&m);
int len=strlen(str);
for(int i=0;i<len;++i)//将字符串的每一位数经过m次操作所得的位的个数求和
{
res+=f[m][str[i]-'0'];
res%=mod;
}
cout<<res<<"\n";
}
return 0;
}
我们不难得出从任意一点到另外一点所需要的x和y,如果对于一点x,y传送到两个不同的点,假设分别需要x1,y1和x2,y2,如果y2/y1与x2/x1比值相等,也就是对应x,y增量成比例,则可以只通过一个魔法阵进行传送,y2/y1=x2/x1,变形一下就是y2/x2=y1/x1,因此我们可以用map来存储对应的比值表示是否存在,如果不存在就添加一个魔法阵,因为还得回去,所以最后结果要变成2倍
#include <bits/stdc++.h>
using namespace std;
int flag = 0;
long long ans;
map<double, bool> m;
int main()
{
int N;
cin >> N;
long long x[505], y[505];
for (int i = 1; i <= N; ++i)
{
cin >> x[i] >> y[i];
for (int j = 1; j < i; ++j)
{
if (x[i] == x[j])//如果分母为0,则单独考虑
{
flag = 1;
}
else
{
flag=0;
double res = double(y[i] - y[j]) / double(x[i] - x[j]);
if (m[res] == 0)
{
m[res] = 1;
ans++;
}
}
ans+=flag;
}
}
cout << ans * 2;
}
任取两个数,如果组合是0,1或1,0则变成1,1如果是1,1变成0,1或1,0,只有0,0是封闭的,无法得到含有1的组合,因此,当s序列有1,t序列全为0时,或者s序列全为0,t序列有1时这两种情况均不可能转化
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int flag = 0;
int main()
{
int T;
string s, t;
cin >> T;
for (int i = 0; i < T; ++i)
{
cin >> s >> t;
if (s.length() != t.length()) {
cout << "NO" << endl;
continue;
}
int ans1 = count(s.begin(), s.end(), '1');
int ans2 = count(t.begin(), t.end(), '1');
if (ans1==0&&ans2!=0||ans1!=0&&ans2==0)
{
cout << "NO" << endl;
}
else cout << "YES" << endl;
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int N = 100100;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int k, l = 0;
cin >> k;
string str;
cin >> str;
int n = str.size();
map<int, ll>mymap;
mymap[0]++;
ll res = 0;
vector<int>v(n + 1), sum(n + 1);
if (k == 0)//k为0时单独考虑
{
ll ans = 0;
str += '1';
n++;
for (int i = 0; i < n; i++)
{
if (str[i] == '0')ans++;//前缀0的数量
else
{
res += (ans + 1) * ans / 2;
ans = 0;
}
}
}
else
{
for (int i = 1; i <= n; i++)
{
v[i] = str[i - 1] - '0';
sum[i] = v[i] + sum[i - 1];
mymap[sum[i]]++;//前缀和
}
int ans = 0;
while (mymap[ans + k] != 0)
{
res += mymap[ans] * mymap[ans + k];
ans++;
}
}
cout << res << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 2;
int a[N];
int main()
{
int n;
scanf("%d",&n);
int cur = 1;
ios::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
for (int j = cur; j <= a[i]; ++j)
{
printf("push %d\n", j);
}
cur = a[i] + 1;
printf("pop\n");
}
}
#include <bits/stdc++.h>
using namespace std;
vector<long long> v;
int main()
{
int m;
long long x, y, k;
cin >> m;
for (int i = 0; i < m; ++i)
{
string s;
cin >> s;
if (s == "insert")
{
cin >> x >> y;
v.insert(v.begin() + x, y);
}
else if (s == "delete")
{
cin >> x;
v.erase(v.begin() + x-1);
}
else
{
cin >> k;
cout << v[k - 1] << endl;
}
}
}
#include<bits/stdc++.h>
using namespace std;
char a[25][25];
bool flag=1;
int n;
int row[25],col;
vector<char>v[25];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int i,j;
cin>>n;
for(i=0;i<n;++i){
col=0;
for(j=0;j<n;++j)
{
cin>>a[i][j];
if(a[i][j]=='W')col++;
if(a[i][j]=='W')row[j]++;
if(j>=2)
if(a[i][j-1]==a[i][j-2]&&a[i][j-1]==a[i][j]){
flag=0;
break;
}
//v[i].push_back(a[i][j]);
if(i>=2)
if(a[i-1][j]==a[i-2][j]&&a[i-1][j]==a[i][j]){
flag=0;
break;
}
}
if(col!=n/2){
flag=0;
break;
}
}
for(int i=0;i<n;++i){
if(row[i]!=n/2){
flag=0;
break;
}
}
if(flag){
cout<<1;
}
else{
cout<<0;
}
}
#include <bits/stdc++.h>
using namespace std;
int flag = 0;
int ans;
int a[42];
set<int> m;
map<int, bool> mp;
int main()
{
int t;
cin >> t;
int N;
while (t--)
{
cin >> N;
for (int i = 0; i < N; ++i)
{
cin >> a[i];
for (int j = 0; j < i; ++j)
{
int res = a[i] - a[j];
if (res)
{
ans = abs(res);
flag = 1;
m.insert(abs(res));
}
}
}
if (!flag)
{
cout << -1 << endl;
continue;
}
for (auto i = m.begin(); i != m.end(); ++i)
{
for (auto j = m.begin(); j != i; ++j)
{
ans = min(ans, __gcd(*i, *j));
}
}
cout << ans << endl;
m.clear();
flag = 0;
}
}