Gym - 101147 & 队内自训#2 题解
A - The game of Osho
题意:每次给你G堆石子,每堆有\(n{_i}\)个,一次可挑走\(B{_i}^k\)个。最后不能选的人输。问最后先手赢还是后手赢。
思路:从SG表的方式入手。
当\(B{_i}\)为奇数时,任意次幂也为奇数,此时若n为奇数,那么第一个人拿走若干后一定剩下是偶数个,第二个人再拿剩下的肯定是奇数个。以此类推此时永远是第一个人拿完后是偶数,所以最后拿到0的那一步也是第一个人拿走的,此时先手必胜。反之后手必胜。所以sg = n&1。
当\(B{_i}\)为偶数时,\(B^k\) = \((B+1 -1)^k\),展开后对(B+1)取余,只有1和B两种情况(二项展开式的第一项为1或-1),那么n可以看出n = k*(B+1) + T, 0<=T<=B,若T小于B,只和T奇偶性有关。若T等于B,画一下sg函数可以知道此时sg为2(两个后继0和B-1,sg分别是0和1)。
最后依照上述判别方式将sg异或起来即可判断。
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
ll sg[105];
vector<ll> f;
ll n, b;
int main()
{
freopen("powers.in","r",stdin);
int kase;
cin>>kase;
while(kase--)
{
int G = read();mem(sg,0);
rep(i,1,G)
{
b = read(), n = read();
if(b&1) sg[i] = n&1;
else
{
ll m = n%(b+1);
if(m==b) sg[i] = 2;
else sg[i] = m&1;
}
}
ll ans = 0;
rep(i,1,G) ans ^= sg[i];
puts(ans?"1":"2");
}
return 0;
}
D - Popcorn
排列组合签到题
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
inline ll C(ll n,ll m){return (ll)round(tgamma(n+1)/tgamma(m+1)/tgamma(n-m+1));}
int main()
{
freopen("popcorn.in", "r", stdin);
int kase;
cin>>kase;
while(kase--)
{
ll n = read(), m = read();
cout<<C(n,m)<<endl;
}
return 0;
}
E - Jumping
题意:给你n个数,每个a[i]代表可以由i移动到(i-a[i])或者(i+a[i]),然后让你输出每个点到n点的最小跳跃次数。
思路:这个题当成最短路做就是模板题。在每个点可以移动到(i-a[i])或者(i+a[i]),那就让i和这两个点建反向边,权值为1,然后跑一个以n为起始点的最短路,采用Dijkstra堆优化,然后输出每个d[i]即可。
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define endl '\n'
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int maxn = 1e6+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') ch = getchar();while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
const int V = 2e5, E=2e5;
ll d[V],cost[E];
ll n,m;
ll head[V],pnt[E],nxt[E],e=1;
ll vis[V];
ll a[V];
inline void addedge(ll u,ll v,ll c)
{
pnt[e]=v; //当前以u为顶点,c为边长的,到v的一条边
cost[e]=c; //存入当前边权值
nxt[e]=head[u]; //下一个其实是前一个
head[u]=e++; //当前边编号
}
inline void Dijkstra(ll s)
{
//mem(d,inf); mem(vis,0);
priority_queue<PII, vector<PII>, greater<PII> > q;
d[s] = 0;
q.push(mp(0LL,s));
while(!q.empty())
{
ll x = q.top().se; q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i=head[x];i;i = nxt[i])
{
ll v = pnt[i];
if(d[v]>d[x]+cost[i]&&!vis[v])
{
d[v] = d[x] + cost[i];
q.push(mp(d[v], v));
}
}
}
}
int main()
{
freopen("jumping.in", "r", stdin);
int kase;
scanf("%d",&kase);
while(kase--)
{
e = 1;
n = read();
rep(i,1,n) d[i] = inf, vis[i] = 0, head[i] = 0;
rep(i,1,n)
{
ll d = read();
ll x = i;
if(x+d<=n)
addedge(x+d,x,1);
if(x-d>0)
addedge(x-d,x,1);
}
Dijkstra(n);
rep(i,1,n) if(d[i]!=inf) cout<<d[i]<<endl; else cout<<-1<<endl;
}
return 0;
}
G - The Galactic Olympics
题意:k种物品放进n个空位里,每个空位只能放一个物品,每种物品可以放到多个空位里,问每种物品都有放置且最后n个空位都放满的方案数有多少种
思路:考点是第二类斯特林数。
在k大于n的时候是没有方案数的。
其他情况下。我们考虑,如果是对每个人去选要去的空位,会产生很多重复的地方。
因为这里n是大于等于k的,所以考虑把n个物品分配给k个人。我们先把n个物品分成k组,然后再分步相乘,乘上k组的排列即可。
比如k=2, n=4, 我们可以先将4分成2两组,有
1 3
2 2
的搭配,方案数数是\(C{_4 ^3}\)+\(C{_4 ^2}\)/2 = 7,再乘上两组间调换位置,全排列\(A{_2}^2\)等于14。
但是当分组变得更多的时候呢,这个时候方案数就不好一下子确定了,所以引进第二类斯特林数。
采用递推式
\(Y[i][j] = Y[i-1][j-1] + j*Y[i-1][j]\)即可求得,其中Y[i][j]代表对i个数分成j组。记得最后乘上k的全排列。
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
ll Y[1005][1005];
int main()
{
freopen("galactic.in","r", stdin);
int kase;
cin>>kase;
while(kase--)
{
ll n = read(), m = read();
if(m > n) cout<<0<<endl;
else
{
Y[0][0] = 1;
rep(i,1,n) rep(j,1,m) Y[i][j] = (Y[i-1][j-1] + (j*Y[i-1][j]))%mod;
ll ans = 1;
rep(i,1,m) ans = (ans%mod*i%mod)%mod;
ans = (ans%mod * Y[n][m]%mod)%mod;
cout<<ans<<endl;
}
}
return 0;
}
H - Commandos
dp模板题,当前状态可以由题中三个状态转移过来。从楼层从上到下dp一遍,最后在底层找最大即可。
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
ll dp[20][20][20];
ll f[20][20][20];
int main()
{
freopen("commandos.in", "r", stdin);
int kase;
cin>>kase;
while(kase--)
{
mem(f,0); mem(dp,0);
ll n = read();
rep(i,1,n)
{
ll x = read(), y = read(), z = read();
f[x][y][z] = read();
}
per(x,10,1) rep(y,1,10) rep(z,1,10) dp[x][y][z] = max(max(dp[x+1][y][z], dp[x][y-1][z]), dp[x][y][z-1]) + f[x][y][z];
ll ans = 0;
rep(y,1,10) rep(z,1,10) ans = max(dp[1][y][z], ans);
cout<<ans<<endl;
}
return 0;
}
Gym - 101147 & 队内自训#2 题解的更多相关文章
- Gym - 101480 CERC 15:部分题目题解(队内第N次训练)
-------------------题目难度较难,但挺有营养的.慢慢补. A .ASCII Addition pro:用一定的形式表示1到9,让你计算加法. sol:模拟. solved by fz ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
- Gym101482 NWERC 2014(队内训练第4场)
-----------------------前面的两场感觉质量不高,就没写题解----------------------------- A .Around the Track pro:给定内多边形 ...
- OI队内测试——石门一
T1: 题目大意: 给你一个立方体,每个面上有些数字,给你一个数字K,你可以玩K轮游戏, 每轮你会将每个面上的数均分为4份,分给相邻的面,求K轮游戏后,上面的数字是 依次给你前.后.上.下.左.右的起 ...
- OI队内测试二【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] T1: 题解:插头dp应该很好想吧,我们考虑当出现转折时我们对下 ...
- GYM - 101147 K.Touristic Trip
题意: 一个人从城市0开始旅行.一共有N座城市,他每到一座城市都会寄一张明信片.给出从一座城市到另一座城市的概率和在每座城市寄出每张明信片的概率.给出长度为k的寄明信片的序列.问在该序列的条件下在第Z ...
- GYM - 101147 J.Whistle's New Car
题意: 给出一颗有点权和边权的树.求每一个点u的子树中有多少点v,使得点v到点u的距离小于等于点v的权值. 题解: 对于每一个点,倍增的预处理出他的祖宗节点及距离.根据预处理的结果求出每个点能到的最远 ...
- GYM - 101147 F.Bishops Alliance
题意: 一个n*n的棋盘,有m个主教.每个主教都有自己的权值p.给出一个值C,在棋盘中找到一个最大点集.这个点集中的点在同一条对角线上且对于点集中任意两点(i,j),i和j之间的主教数(包括i,j)不 ...
- GYM - 101147 C.The Wall
题意: 长和宽分别为M+N/2,N的矩形中.有很多敌人的点.有两种方法消灭敌人. 1.N个桶,第i个桶可以消灭i-1<=x<i中的敌人.2.M个摆(半圆)每个摆可以消灭距离他前面不超过1以 ...
- GYM - 101147 B.Street
题意: 大矩形代表市场,大矩形当中有很多小矩形样式的伞.这些小矩形都贴着大矩形的左边或者右边且互不相交.小矩形以外的地方都是阳光.求经过大矩形时在阳光下的最短时间. 题解: 最短路的做法.起点和终点与 ...
随机推荐
- cesium czml更新dataSource
cesium czml更新dataSource:沙盒
- Python3正则表达式(一)
Python3正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. r ...
- AWVS(Acunetix)
网络安全渗透测试-AWVS(Acunetix)漏洞扫描工具安装与使用教程 AWVS安装与激活 AWVS简介 AWVS(Acunetix Vulnerability Scanner)是一款网络漏洞扫描工 ...
- 深度解析Maven版本仲裁机制:核心规则与原理
结论先行 Maven的版本仲裁机制本质是通过 依赖路径 和 声明顺序 的优先级规则,自动解决多版本依赖冲突.其核心规则为: 最短路径优先:依赖树中路径最短的版本生效. 相同路径则先声明优先:路径长度相 ...
- windows 配置jdk8环境变量
JAVA_HOME: E:\Android\Java\jdk1.8.0_131 PATH: %JAVA_HOME\%bin 也可以只配置PATH就可以,如 E:\Android\Java\jdk1.8 ...
- helm,efk日志系统
helm:存放配单清单的 chart图表 chart仓库 chart,helm-->Tiller-->api server -->kube_cluster chart---> ...
- RISC介绍
CPU中包含了控制部件和运算部件,即中央处理器.1971 年,Intel 将运算器和控制器集成在一个芯片上,称为 4004 微处理器,这标志着 CPU 的诞生.到了 1978 年,开发的 8086 处 ...
- TVM: 编译深度学习模型的快速入门教程
支持的TVM硬件后端概述 下图显示了 TVM 目前支持的硬件后端: 在本教程中,将选择 cuda 和 llvm 作为目标后端.首先,让导入 Relay 和 TVM. import numpy as n ...
- C# 之静态构造器与静态字段初始化器
public class Test { /// <summary> /// 静态字段初始化器会在调用静态构造器前运行. /// 如果类型没有静态构造器,字段会在类型被使用前或运行时中更早的 ...
- 【公众号搬运】gap
.markdown-body { line-height: 1.8; font-weight: 400; font-size: 16px; word-spacing: 2px; letter-spac ...