和
很快想到最终计算结果中1越多越好,但是最后想歪了。
最多的1肯定是离
所以只需要两个数就可以完成,剩下的全填
给您一个
有效的一步棋是将一只车放在一个位置(
你先开始,当你在自己的回合中走了一步有效的棋,将白车置于位置(
您已经与计算机下了
如果存在一个坐标(
问题不难转化成为在一个
由于棋子在什么位置放置不重要,这引发的一个问题就是:如果你在棋盘重点中间的某个位置放置棋子递推剩下的
所以只需要按着棋盘边缘放置就可以。
这样
#include <bits/stdc++.h>
using namespace std;
using p = pair<int, int>;
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr);
#define int long long
const int INF = 1e18;
const int mod = 1e9 + 7;
int rem[300005];
int dp(int n)
{
if (n < 0)
return 0;
if (rem[n])
return rem[n];
if (n == 1 || n == 0)
return 1;
if (n == 2)
return 3;
return rem[n] = (2 * (n - 1) * dp(n - 2) % mod + dp(n - 1) % mod) % mod;
}
void solve()
{
int n, k;
cin >> n >> k;
int ans = n;
for (int i = 1; i <= k; i++)
{
int u, v;
cin >> u >> v;
if (u == v)
ans--;
else
ans -= 2;
}
cout << dp(ans) << endl;
return;
}
signed main()
{
IOS;
int t;
cin >> t;
while (t--)
{
solve();
}
system("pause");
return 0;
}
给你一个数组
定义
数据保证
现场就想到了转化成
首先没有想到的是,决定整个
因为如果最高位为
而如果
是对其求
其次没有想出来的(花费最大时间思考的),如何寻找满足条件的区间数对
显然,满足条件的区间应保证:
在区间内的所有数的第
问题归结到了异或最重要的性质:
所以,对于查询
返回题目,对于第
因为要求必须含有第
枚举左右端点的个数,然后乘法原理即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr);
void solve()
{
int n;
cin >> n;
vector<int> a(n + 1);
vector<int> sum(32);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] ^= a[i - 1];
for (int j = 31; j >= 0; j--)
{
sum[j] += ((a[i] >> j) & 1);
}
}
vector<int> tmp(32);
int ans = 0;
for (int i = 1; i <= n; i++)
{
int tar = a[i] ^ a[i - 1];
int k = __lg(tar);
ans += (tmp[k] * (sum[k] - tmp[k]) + (i - tmp[k]) * (n - i + 1 - sum[k] + tmp[k]));
for (int j = 31; j >= 0; j--)
{
tmp[j] += ((a[i] >> j) & 1);
}
}
cout << ans << endl;
return;
}
int32_t main()
{
IOS;
int t;
cin >> t;
while (t--)
{
solve();
}
system("pause");
return 0;
}
给定
问题在于怎么化简所求的函数式子。
显然,连续的
任意连续的
因为
那么问题就转化成了对于所有的质数和4分析。
涉及到区间修改问题,采用差分前缀和维护即可。
#include <bits/stdc++.h>
using namespace std;
using p = pair<int, int>;
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr);
#define int long long
const int INF = 1e18;
const int mod = 1e9 + 7;
const int maxn = 1e6;
vector<int> ans(maxn + 5);
vector<bool> vis(maxn + 5);
vector<int> prime;
void euler(int n)
{
vis[1] = true;
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
prime.push_back(i);
}
for (int j = 0; j < prime.size() && i * prime[j] <= n; j++)
{
vis[i * prime[j]] = 1;
if (i % prime[j] == 0)
break;
}
}
}
void solve()
{
for (auto p : prime)
{
int cnt = p - 1;
for (int pos = p; pos <= maxn; pos += p)
{
int l = pos;
int r = min(pos + p, maxn);
(ans[l] += cnt) %= mod;
if (r == pos + p)
{
ans[r] = (ans[r] - cnt + mod) % mod;
}
cnt = (p + cnt - 1) % p;
}
}
int calc = 1;
for (int pos = 4; pos <= maxn; pos += 4, calc++)
{
int l = pos;
int r = min(pos + 4, maxn);
(ans[l] += (calc & 1) * 2) %= mod;
if (r == pos + 4)
{
ans[r] = (ans[r] - (calc & 1) * 2 + mod) % mod;
}
}
for (int i = 1; i <= maxn; i++)
{
(ans[i] += ans[i - 1]) %= mod;
}
for (int i = 1; i <= maxn; i++)
{
(ans[i] += ans[i - 1]) %= mod;
}
return;
}
signed main()
{
IOS;
int t;
cin >> t;
euler(maxn);
solve();
while (t--)
{
int n;
cin >> n;
cout << ans[n] << endl;
}
system("pause");
return 0;
}
请我喝杯咖啡吧~