Wannafly挑战赛24

Wannafly挑战赛24

题目连接

https://www.nowcoder.com/acm/contest/186#question


A.石子游戏

题解

注意到当石子个数为偶数的时候,每回合都会减少一堆偶数石子,因此,先手必胜.

我们可以不考虑奇数堆石子,因为必胜方始终可以动偶数堆.

当必败方将奇数堆分成一堆偶数和一堆奇数的时候,必胜方将新生成偶数堆移动到原有的偶数堆中即可抵消对方的移动.

代码

#include <iostream>
int main() {int n;std::cin >> n;int cnt = 0;for(int i = 1;i <= n;++i) {int tmp;std::cin >> tmp;if(tmp % 2 == 0) cnt ++;}if(cnt && cnt % 2 == 0) puts("Alice");else puts("Bob");
}

B.222333

题解

先暴力枚举m+nm+nm+n,然后从小到大枚举mmm,找到第一个适合的break即可.

代码

#include <iostream>typedef long long LL;
LL P;
LL mypow(LL x,int n,LL P) {LL res = 1;while(n) {if(n & 1) res = res * x % P;x = x*x % P;n >>= 1;}return res;
}int find(int s) {long long ans = 1;for(int x = 1;x < s;++x) {ans = (mypow(2,x,P) * mypow(3,s-x,P) % P + P-1)%P;if(ans == 0) return x;}return -1;
}int main() {while(std::cin >> P) {for(int i = 2;i <= P;++i) {int x = find(i);if(x != -1){std::cout << x << " " << i-x << std::endl;break;}}}}

C.失衡天平

题解

经典的动态规划问题.

我们记dp[i][j]dp[i][j]dp[i][j]表示考虑前iii个武器,取出来一些武器满足左边减去右边重量差为jjj,所能取得的最大重量和.

递推方程:

dp[i+1][j−w[i+1]]←dp[i][j]+w[i+1]dp[i+1][j-w[i+1]] \leftarrow dp[i][j] + w[i+1]dp[i+1][jw[i+1]]dp[i][j]+w[i+1]

dp[i+1][j+w[i+1]]←dp[i][j]+w[i+1]dp[i+1][j+w[i+1]] \leftarrow dp[i][j] + w[i+1]dp[i+1][j+w[i+1]]dp[i][j]+w[i+1]

注意数组元素不能有负,因此需要给第二维一个basebasebase.

代码

int n,m;
int w[107];
int dp[107][20010];
const int base = 10000;
int main() {std::ios::sync_with_stdio(false);std::cin >> n >> m;for(int i = 1;i <= n;++i)std::cin >> w[i];for(int i = 0;i <= 100;++i) for(int j = 0;j <= 20000;++j)dp[i][j] = -100000;dp[0][base] = 0;for(int i = 0;i < n;++i) {for(int j = 0;j <= 20000;++j) {if(j < 0) continue;dp[i+1][j] = std::max(dp[i][j],dp[i+1][j]);if(j + w[i+1] <= 20000)dp[i+1][j+w[i+1]] = std::max(dp[i+1][j+w[i+1]],dp[i][j] + w[i+1]);if(j - w[i+1] >= 0)dp[i+1][j-w[i+1]] = std::max(dp[i+1][j-w[i+1]],dp[i][j] + w[i+1]);}}int ans = 0;for(int i = 0;i <= m;++i) {ans = std::max(ans,dp[n][base+i]);ans = std::max(ans,dp[n][base-i]);}std::cout << ans << std::endl;
}

D.无限手套

题解

一眼动态规划.

dp[i][j]dp[i][j]dp[i][j]表示考虑前iii种宝石,已经使用了jjj颗宝石,所获得的可能的力量之和.

递推方程:

dp[i+1][j]=∑t=0jdp[i][t](ai+1(j−t)2+bi+1(j−t)+1)dp[i+1][j] = \sum_{t = 0}^{j}{dp[i][t](a_{i+1}(j-t)^2+b_{i+1}(j-t)+1)}dp[i+1][j]=t=0jdp[i][t](ai+1(jt)2+bi+1(jt)+1)

将后面的部分展开

dp[i+1][j]=∑t=0j(ai+1∗dp[i][t]∗t2−(bi+1+2j∗ai+1)∗dp[i][t]∗t+(ai+1∗j2+bi+1∗j+1)∗dp[i][t])dp[i+1][j] = \sum_{t=0}^{j}(a_{i+1}*dp[i][t]*t^2 -(b_{i+1}+2j*a_{i+1})*dp[i][t]*t + (a_{i+1}*j^2+b_{i+1}*j+1)*dp[i][t])dp[i+1][j]=t=0j(ai+1dp[i][t]t2(bi+1+2jai+1)dp[i][t]t+(ai+1j2+bi+1j+1)dp[i][t])

继续化简得到

dp[i+1][j]=ai+1∑t=0jdp[i][t]t2−(bi+1+2j∗ai+1)∑t=0jdp[i][t]t+(ai+1∗j2+bi+1∗j+1)∑t=0jdp[i][t]dp[i+1][j] = a_{i+1}\sum_{t=0}^{j}dp[i][t]t^2 -(b_{i+1}+2j*a_{i+1})\sum_{t=0}^{j}dp[i][t]t + (a_{i+1}*j^2+b_{i+1}*j+1)\sum_{t=0}^{j}dp[i][t]dp[i+1][j]=ai+1t=0jdp[i][t]t2(bi+1+2jai+1)t=0jdp[i][t]t+(ai+1j2+bi+1j+1)t=0jdp[i][t]

如果我们令

sum2[j]=∑t=0jdp[i][t]t2sum_2[j] = \sum_{t=0}^{j}dp[i][t]t^2sum2[j]=t=0jdp[i][t]t2
sum1[j]=∑t=0jdp[i][t]tsum_1[j] = \sum_{t=0}^{j}dp[i][t]tsum1[j]=t=0jdp[i][t]t
sum0[j]=∑t=0jdp[i][t]sum_0[j] = \sum_{t=0}^{j}dp[i][t]sum0[j]=t=0jdp[i][t]

那么

dp[i+1][j]=ai+1sum2[j]−(bi+1+2j∗ai+1)sum1[j]+(ai+1∗j2+bi+1∗j+1)sum0[j]dp[i+1][j] = a_{i+1}sum_2[j] -(b_{i+1}+2j*a_{i+1})sum_1[j]+ (a_{i+1}*j^2+b_{i+1}*j+1)sum_0[j]dp[i+1][j]=ai+1sum2[j](bi+1+2jai+1)sum1[j]+(ai+1j2+bi+1j+1)sum0[j]

转移就变成O(1)O(1)O(1)的了,空间上再滚动数组优化一下就过了.

代码

typedef long long LL;
const int N = 10007;
const LL P = 998244353;
LL dp[2][N],a[N],b[N],sum2[2][N],sum1[2][N],sum0[2][N];
LL Mul(LL a,LL b) {return a * b % P;
}
LL Add(LL a,LL b) {return (a + b) % P;
}
int n,q;
int main() {std::ios::sync_with_stdio(false);std::cin >> n;rep(i,1,n) {std::cin >> a[i] >> b[i];}sum0[1][0] = 1;rep(i,1,10000) {dp[1][i] = ((a[1]*i%P*i%P) + (b[1]*i%P) + 1)%P;sum2[1][i] = Add(sum2[1][i-1],dp[1][i]*i%P*i%P);sum1[1][i] = Add(sum1[1][i-1],dp[1][i]*i%P);sum0[1][i] = Add(sum0[1][i-1],dp[1][i]);}rep(i,2,n) {rep(j,0,10000) {dp[i&1][j] = (Mul(a[i],sum2[(i+1)&1][j]) - Mul(b[i]+2*j*a[i]%P,sum1[(i+1)&1][j]) + Mul((a[i]*j%P*j%P+b[i]*j+1)%P,sum0[(i+1)&1][j]) + P )% P;sum0[i&1][j] = dp[i&1][j];sum1[i&1][j] = dp[i&1][j]*j%P;sum2[i&1][j] = dp[i&1][j]*j%P*j%P;if(j) {sum0[i&1][j] = Add(sum0[i&1][j],sum0[i&1][j-1]);sum1[i&1][j] = Add(sum1[i&1][j],sum1[i&1][j-1]);sum2[i&1][j] = Add(sum2[i&1][j],sum2[i&1][j-1]);}}memset(sum0[(i+1)&1],0,sizeof(sum0[(i+1)&1]));memset(sum1[(i+1)&1],0,sizeof(sum1[(i+1)&1]));memset(sum2[(i+1)&1],0,sizeof(sum2[(i+1)&1]));}std::cin >> q;while(q--){int x;std::cin >> x;std::cout << dp[n&1][x] << std::endl;}return 0;
}

E.旅行

题解

还没看…

F. wyf的超级多项式

题解

很棒的一道题,学了很多知识.

我们考虑FnF_nFn的递推公式,猜测

Fn=c1Fn−1+c2Fn−2+...+ckFn−kF_n = c_1F_{n-1}+c_2F_{n-2}+...+c_kF_{n-k}Fn=c1Fn1+c2Fn2+...+ckFnk

下面我们需要求出c1,c2,...,ck.c_1,c_2,...,c_k.c1,c2,...,ck.

c0=−1c_0 = -1c0=1,我们将递推式整理一下得到:

c0Fn+c1Fn−1+c2Fn−2+...+ckFn−k=0c_0F_n + c_1F_{n-1}+c_2F_{n-2}+...+c_kF_{n-k} = 0c0Fn+c1Fn1+c2Fn2+...+ckFnk=0

由于前FiF_{i}Fi的通项公式已经给出了,我们可以将其代入得到:

[c0a1v1nc0a2v2nc0a3v3n...c0akvknc1a1v1n−1c1a2v2n−1c1a3v3n−1...c1akvkn−1c2a1v1n−2c2a2v2n−2c2a3v3n−2...c2akvkn−2...............cka1v1n−kcka2v2n−kcka3v3n−k...ckakvkn−k]\left[ \begin{matrix} c_0a_1v_1^n &amp; c_0a_2v_2^n &amp; c_0a_3v_3^n &amp; ...&amp; c_0a_kv_k^n\\ c_1a_1v_1^{n-1} &amp; c_1a_2v_2^{n-1} &amp; c_1a_3v_3^{n-1} &amp; ...&amp; c_1a_kv_k^{n-1}\\ c_2a_1v_1^{n-2} &amp; c_2a_2v_2^{n-2} &amp; c_2a_3v_3^{n-2} &amp; ...&amp; c_2a_kv_k^{n-2}\\ ... &amp; ... &amp; ... &amp; ... &amp; ...\\ c_ka_1v_1^{n-k} &amp; c_ka_2v_2^{n-k} &amp; c_ka_3v_3^{n-k} &amp; ...&amp; c_ka_kv_k^{n-k}\\ \end{matrix} \right] c0a1v1nc1a1v1n1c2a1v1n2...cka1v1nkc0a2v2nc1a2v2n1c2a2v2n2...cka2v2nkc0a3v3nc1a3v3n1c2a3v3n2...cka3v3nk...............c0akvknc1akvkn1c2akvkn2...ckakvknk
上面矩阵中所有的项之和等于000.

首先,分析一下这个矩阵,每一行的和肯定不能为000了,因为它使我们要求的答案,那么我们可以利用充分条件构造每一列都是000,这样整个矩阵所有项的和就是000了.

这么构造是有原因的,每一列形式都很相似,可以归结到多项式中去.

G(x)=ck+ck−1x+...+c0xkG(x) = c_k + c_{k-1}x + ... + c_0x^kG(x)=ck+ck1x+...+c0xk,显然v1,v2...,vkv_1,v_2...,v_kv1,v2...,vkG(x)G(x)G(x)kkk个零点,因此我们得到G(x)=a(x−v1)(x−v2)...(x−vk)G(x) = a(x-v_1)(x-v_2)...(x-v_k)G(x)=a(xv1)(xv2)...(xvk)

又由于c0=−1c_0 = -1c0=1,得到a=−1a = -1a=1,

所以G(x)=−(x−v1)(x−v2)...(x−vk)G(x) = -(x-v_1)(x-v_2)...(x-v_k)G(x)=(xv1)(xv2)...(xvk)

ccc序列即GGG函数的系数,因此求出了GGG就可以确定ccc了.

对于这种形式的多项式展开,我们使用分治FFT/NTTFFT/NTTFFT/NTT就可以在O(nlogn2)O(nlogn^2)O(nlogn2)时间内做到了.

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i)
#define clr(x) memset(x,0,sizeof(x))
#define setinf(x) memset(x,0x3f,sizeof(x))typedef long long LL;
const int N = 1 << 20;
const int P = 1004535809;
const int G = 3;
const int NUM = 20;LL  wn[NUM];
LL  a[N], b[N];LL quick_mod(LL a, LL b, LL m)
{LL ans = 1;a %= m;while(b){if(b & 1){ans = ans * a % m;b--;}b >>= 1;a = a * a % m;}return ans;
}void GetWn()
{for(int i = 0; i < NUM; i++){int t = 1 << i;wn[i] = quick_mod(G, (P - 1) / t, P);}
}
void Rader(LL a[], int len)
{int j = len >> 1;for(int i = 1; i < len - 1; i++){if(i < j) std::swap(a[i], a[j]);int k = len >> 1;while(j >= k){j -= k;k >>= 1;}if(j < k) j += k;}
}void NTT(LL a[], int len, int on)
{Rader(a, len);int id = 0;for(int h = 2; h <= len; h <<= 1){id++;for(int j = 0; j < len; j += h){LL w = 1;for(int k = j; k < j + h / 2; k++){LL u = a[k] % P;LL t = w * a[k + h / 2] % P;a[k] = (u + t) % P;a[k + h / 2] = (u - t + P) % P;w = w * wn[id] % P;}}}if(on == -1){for(int i = 1; i < len / 2; i++)std::swap(a[i], a[len - i]);LL inv = quick_mod(len, P - 2, P);for(int i = 0; i < len; i++)a[i] = a[i] * inv % P;}
}void Conv(LL a[], LL b[], int n)
{NTT(a, n, 1);NTT(b, n, 1);for(int i = 0; i < n; i++)a[i] = a[i] * b[i] % P;NTT(a, n, -1);
}
LL v[N],F[N];LL C[N];inline int expand(int x){int res = 1;while(res < x) res <<= 1;res <<= 1;return res;
}void solve(int l,int r,LL Ans[]) {if(r == l) {Ans[0] = P-v[l];Ans[1] = 1;return ;}int mid = (l + r) / 2;int lft = mid - l + 1;int rgt = r - mid;LL *LA = new LL[(lft+1)*2],*RA = new LL[(rgt+1)*2];solve(l,mid,LA);solve(mid+1,r,RA);rep(i,0,lft) a[i] = LA[i];rep(i,0,rgt) b[i] = RA[i];int len = 1;while(len <= r-l+1) len <<= 1;rep(i,lft+1,len) a[i] = 0;rep(i,rgt+1,len) b[i] = 0;NTT(a,len,1);NTT(b,len,1);rep(i,0,len) a[i] = a[i] * b[i];NTT(a,len,-1);rep(i,0,r-l+1) Ans[i] = a[i];
}
int n,k;
int main()
{GetWn();std::ios::sync_with_stdio(false);std::cin >> n >> k;rep(i,1,k) {std::cin >> v[i];}rep(i,1,k) {std::cin >> F[i];}solve(1,k,C);rep(i,k+1,n) {rep(j,1,k) {F[i] = (F[i] + ((P-C[k-j] % P)*F[i-j] % P)) % P;}}std::cout << F[n] << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【模拟】正方形

正方形 题目大意&#xff1a; 有三个人&#xff0c;一人一笔的画正方形&#xff0c;每个正方形是上一个正方形每条边上的中点连接而成的&#xff0c;求每个人画了多长 原题&#xff1a; 题目描述 又到暑假啦&#xff0c;Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快…

P3975-[TJOI2015]弦论【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3975 题目大意 给一个字符串sss和t,kt,kt,k。求字符串sss第kkk大的子串。 当T0T0T0时&#xff0c;相同的子串算一个当T1T1T1时&#xff0c;不同位置的相同子串算不同的串 解题思路 当T0T0T0时很简单&#xff0c;对于每个位…

【DP】跳格子

跳格子 题目大意&#xff1a; 有一堆格子&#xff0c;可以往前跳不超过当前格子上的数的步数&#xff0c;从1跳到最后一格最少要跳多少 原题&#xff1a; 题目描述 大家都说要劳逸结合&#xff0c;Ayumi, Mitsuhiko, Genta画完方格就出去运动啦&#xff01; 他们来到了一片…

.NET Core微服务之基于IdentityServer建立授权与验证服务

一、IdentityServer的预备知识要学习IdentityServer&#xff0c;事先得了解一下基于Token的验证体系&#xff0c;这是一个庞大的主题&#xff0c;涉及到Token&#xff0c;OAuth&OpenID&#xff0c;JWT&#xff0c;协议规范等等等等&#xff0c;园子里已经有很多介绍的文章了…

模拟退火求解TSP问题

模拟退火求解TSP问题 模拟退火算法步骤 1.寻找下一个解 2.计算下一个解的能量 3.决定是否接受这个解 4.降温 算法模板 double randfloat() {return rand()/(RAND_MAX0.0); }double T0 1000000,Tk 1,T T0,d 0.9999; int x initx();//当前解(初始解) int ansE,nowE;//全…

P2444-[POI2000]病毒【AC自动机】

正题 题目链接:https://www.luogu.com.cn/problem/P2444 题目大意 nnn个字符串&#xff0c;求有没有一个无限的字符串不包含任何一个给出的字符串。 解题思路 考虑ACACAC自动机的匹配方式&#xff0c;不过每次我们可以每次在构出的TrieTrieTrie树上随意走&#xff08;就是求完…

【模拟】2048

2048 题目大意&#xff1a; 模拟2048游戏 原题&#xff1a; 题目描述 此时&#xff0c;Conan却在一旁玩着2048。 这是一个4*4的矩阵&#xff0c;初始全为0。每次一个没有数字的格子中会随机出现一个2或4&#xff0c;每次可以选择上下左右其中一个方向去滑动&#xff0c;每…

在Docker中部署Asp.net core2.1以及修改发布

本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序&#xff0c;以及修改系统之后&#xff0c;发布更新。本文章采用自定义的Docker文件系统要求&#xff1a;1.服务器或本地已经安装docker一、创建一个Asp.Net Core 2.1 Web应用&#xff08;若可以熟练创建项目&#xf…

HDU5322 - cdq分治FFT加速dp

5322 Hope [CDQ分治FFT加速计算dp] 题意 每一个每一个排列,排列中每个数向它后面第一个比它大的数连一条边. 每个排列对于答案的贡献是这个排列所生成的图中的每一个联通量中点的个数的平方之积. 例如:排列 1,2,3,6,4,51,2,3,6,4,51,2,3,6,4,5 其中 1,2,3,61,2,3,61,2,3,6形…

AT2300-[ARC068C]Snuke Line【整除分块】

正题 题目链接: https://www.luogu.com.cn/problem/AT2300 https://atcoder.jp/contests/arc068/tasks/arc068_c 题目大意 有mmm个车站&#xff0c;nnn种礼品&#xff0c;第iii种可以在[li,ri][l_i,r_i][li​,ri​]的车站买到&#xff0c;第ddd辆车会近过编号为ddd的倍数的车…

【二分】游戏

游戏 题目大意&#xff1a; 有三个套餐&#xff0c;1&#xff1a;一个a、一个b和一个c,2&#xff1a;一个a和两个b&#xff0c;3&#xff1a;两个a和一个b&#xff0c;现在有一定的a、b和c&#xff0c;要使任意两个形同的套餐不相邻&#xff0c;问最多可以有多少个套餐&#…

要用Identity Server 4 -- OAuth 2.0 超级简介

OAuth 2.0 简介OAuth有一些定义:OAuth 2.0是一个委托协议, 它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源, 注意是代表这些人, 而不是假冒或模仿这些人. 这个应用从资源的所有者那里获得到授权(Authorization)和access token, 随后就可以使用这个access…

清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]

清明梦超能力者黄YY 题目连接 https://www.nowcoder.com/acm/contest/206/I 暂时有两种做法. 算法一 涉及:树链剖分,扫描线 在一个线段的情况下,我们可以把一个染色区间拆成左端点处增加事件,右端点处删除事件. 维护一颗权值线段树. 这样,端点从小到大扫描时,遇到增加事件…

初一模拟赛总结(3.23)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf300300300100100100100100100100100100000222wjjwjjwjj290290290100100100100100100909090000333hkyhkyhky270270270100100100100100100707070000444fyfyfy24024024010010010010…

CF1110E-Magic Stones【结论题,差分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1110E 题目大意 给出一个序列cic_ici​和一个序列tit_iti​。每次操作可以将cici−1ci1−ci(1<i<n)c_ic_{i-1}c_{i1}-c_i(1<i<n)ci​ci−1​ci1​−ci​(1<i<n) 解题思路 首先要求c1t1,cntnc_1t_1,c_nt…

好代码是管出来的——C#的代码规范

代码是软件开发过程的产物&#xff0c;代码的作用是通过编译器编译后运行&#xff0c;达到预期的效果(功能、稳定性、安全性等等)&#xff0c;而另外一个重要作用是给人阅读。对于机器来说只要代码正确就能够正确的运行程序&#xff0c;但是人不同&#xff0c;如果代码编写混乱…

【图论】【高精】产生数(ssl 1021/ luogu 1037)

产生数 ssl 1021 luogu 1037 题目大意&#xff1a; 有一个数&#xff0c;可以使某些数字变成相对应的数字&#xff0c;问有多少种变法 原题&#xff1a; Description 给出一个整数 n&#xff08;n<10^30) 和 k 个变换规则&#xff08;k<15&#xff09;。   规则…

P3224-[HNOI2012]永无乡【平衡树,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P3224 题目大意 nnn个点&#xff0c;每次可以连接两个点和询问一个点所在联通块中第kkk大的数。 解题思路 我们发现可以启发式合并&#xff0c;对于每个联通块维护一个线段树&#xff0c;然后每次合并时将小的暴力丢入大的平…

牛客国庆集训派对Day6

牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到135...2k−1k2135...2k-1 k^2135...2k−1k2即可已做这道题了. 其他的地方连边都很方便.每一个区域向汇点连很多条容量为111的边,但费用分别是1,3,5,...,2k−11,3,5,...,2k-11…

.NET Core微服务之基于IdentityServer建立授权与验证服务(续)

上一篇《.NET Core微服务之基于IdentityServer建立授权与验证服务》我们基于IdentityServer4建立了一个AuthorizationServer&#xff0c;并且继承了QuickStartUI&#xff0c;能够成功获取Token了。这一篇我们了解下如何集成API Service和MVC Web Application。一、集成API Serv…