Wannafly挑战赛9
链接:https://www.nowcoder.com/acm/contest/71/A
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
输出描述:
输出符合条件个数
输入
5 1 2 3 4 5
输出
2
说明
5个数中1和2符合条件,1是后面每个数的因子,2是4的因子
备注:
1≤n,a
i
≤1000000
这个就是利用埃筛的思想枚举就可以了,1需要的次数比较多,特判下吧
还可以离散化,应该跑的更快
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; int b[N],a[N],sum; int main() {ios::sync_with_stdio(false);int n;cin>>n;for(int i=0; i<n; i++)cin>>a[i],b[a[i]]=1;for(int i=0; i<n; i++){if(a[i]==1){sum++;continue;}for(int j=a[i]+a[i]; j<N; j+=a[i])if(b[j]==1){sum++;break;}}printf("%d\n",sum);return 0; }
链接:https://www.nowcoder.com/acm/contest/71/C
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
每行包括数列中的一项Ak(k<=100000)。
总行数T<=30。
输出描述:
对于每一项Ak,输出一行包括一个正整数k表示输入中数是数列的第几项。
输入
2 3 5 8 13
输出
2 3 4 5 6
循环节是这样
并不一定我代码能过,等等我的逻辑好像有问题,应该要有冲突的?还是py直接写吧,不难
#include<bits/stdc++.h> using namespace std; const int MD=1e8+7,N=1e5+5; int ans[N]; unordered_map<int,int>M; int main() {ans[0]=ans[1]=1;for(int i=2; i<N; i++)ans[i]=(ans[i-1]+ans[i-2])%MD,M[ans[i]]=i;string s;while(cin>>s){int ans=0;for(int i=0; s[i]; ++i)ans=ans*10+(s[i]-'0'),ans%=MD;printf("%d\n",M[ans]);}return 0; }
好吧,写错了,这么多冲突的,1e9+7只有一个冲突,特判下还是可以的
py代码
ans = [] M = {} ans.append(1) M[1] = 1 ans.append(2) M[2] = 2 for i in range(100000):ans.append(ans[-1] + ans[-2])M[ans[-1]] = len(ans)while True:try:n = input()if n:print(M[int(n)])except EOFError:break
链接:https://www.nowcoder.com/acm/contest/71/D
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行一个正整数T,表示数据组数。(1<=T<=10000)对于每组数据包含一行三个正整数n,m,k。
输出描述:
输入
2 3 3 3 3 3 2
输出
1 2
输入
5 10 3 2 10 2 2 10 7 5 10 6 2 10 7 6
输出
6864 11934 2200 3780 924
输入
2 5 4 4 5 2 1
输出
5 14
备注:
1<=n,m,k<=10
6
n次入栈m次出栈的合法排列次数则可参考卡特兰数公式。C(n+m,m)-C(n+m,m-1)
#include<bits/stdc++.h> using namespace std; const int MD=1e9+7,N=2e6+5; int f[N],v[N]; int C(int n,int m) {if(m<0||m>n) return 0;return 1LL*f[n]*v[m]%MD*v[n-m]%MD; } int F(int n,int m) {return (C(n+m,m)-C(n+m,m-1)+MD)%MD; } int main() {v[0]=v[1]=f[0]=f[1]=1;for(int i=2; i<N; i++) f[i]=1LL*f[i-1]*i%MD,v[i]=1LL*v[MD%i]*(MD-MD/i)%MD;for(int i=2; i<N; i++) v[i]=1LL*v[i-1]*v[i]%MD;int n,m,k,T;scanf("%d",&T);while (T--){scanf("%d%d%d",&n,&m,&k);printf("%d\n",1LL*F(m-1,m-k)*F(n-m+k,n-m)%MD);}return 0; }
看了另一个聚聚是处理倒着的逆元,骚的
inv[i]=inv[p%i]*(p-p/i)%p递推得到逆元
invf[i]=invf[i+1]*(i+1)%p这个公式反递推得到1!~n!的逆元
C(n,m)=A(n,m)/m!=n!/(m!*(n-m)!)所以C(n,m)=C(n,n-m)
所以C(n+m,m)-C(n+m,m-1)=C(n+m,(n+m)-n))-C(n+m,(n+m)-(m-1))=C(n+m,n)-C(n+m,n+1)
#include<bits/stdc++.h> using namespace std; const int MD=1e9+7,N=2e6+5; int INV(int x) {return x==1?x:1LL*(MD-MD/x)*INV(MD%x)%MD; } int f[N],v[N]; int C(int n,int m) {if(m<0||m>n) return 0;return 1LL*f[n]*v[m]%MD*v[n-m]%MD; } int F(int n,int m) {return (C(n+m,n)-C(n+m,n+1)+MD)%MD; } int main() {f[0]=1;for (int i=1; i<N; i++) f[i]=1LL*f[i-1]*i%MD;v[N-1]=INV(f[N-1]);for (int i=N-2; i>=0; i--) v[i]=v[i+1]*(i+1LL)%MD;int n,m,k,T;scanf("%d",&T);while (T--){scanf("%d%d%d",&n,&m,&k);printf("%d\n",1LL*F(m-1,m-k)*F(n-m+k,n-m)%MD);}return 0; }
链接:https://www.nowcoder.com/acm/contest/71/B
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行一个整数n。接下来n行每行一个仅由英文字母构成的非空字符串,第i个字符串代表s
i
。
输出描述:
共n行,第i行输出
对 998244353取模的结果。
输入
1 BALDRSKYKirishimaRain
输出
1
备注:
1 ≤ n ≤ 10
6
,所有字符串的总长度不超过2*10
6
#include <bits/stdc++.h> using namespace std; const int N=1e6+5,MD=998244353; string s[N]; int f[N+N]; int main() {int n,mi=N+N,ff,ans=1;cin>>n;for(int i=0; i<n; i++){cin>>s[i];if(s[i].size()<mi)mi=s[i].size(),ff=i;}for(int j=1; j<s[ff].size(); j++){int k=f[j];while(k&&s[ff][j]!=s[ff][k]) k=f[k];f[j+1]=s[ff][j]==s[ff][k]?k+1:0;}for(int j=0; j<n; j++){int cnt=0;for(int k=0,l=0; k<s[j].size(); k++){while (l&&s[ff][l]!=s[j][k]) l=f[l];if (s[ff][l]==s[j][k]) l++;if (l==mi)cnt++;}ans=ans*1LL*cnt%MD;}for(int i=0; i<n; i++)cout<<(s[i].size()==mi?ans:0)<<"\n";return 0; }
链接:https://www.nowcoder.com/acm/contest/71/E
来源:牛客网
空间限制:C/C++ 65536K,其他语言131072K
Special Judge, 64bit IO Format: %lld
题目描述
1、对于区间 [l,r],其区间元素按位或和等于 x
2、对于区间 [l,r],其区间元素按位与和等于 x
求出一个数列 A,使得满足给定的 m 个条件,保证有解。
输入描述:
输入第一行两个正整数 n,m,意义如上接下来 m 行,每行四个整数 op,l,r,x,表示一组限制op = 1 表示是限制 1,op = 2 表示是限制 2
输出描述:
输出仅一行,n 个整数 a
i
表示数列 A。要求 0 <= a
i
< 10
9
输入
4 3 1 1 2 9 2 3 4 2 1 2 3 11
输出
1 9 2 6
备注:
1<=n,m<=10^5, 1<=l<=r<=n, 0<=x<2^20
有3维BIT的,竟然还有一个dij的写法,666
#include<iostream> #include<cstdio> #include<queue> const int N=1e5+5; int n,m,a[N],d[N]; int op[N],L[N],R[N],x[N]; int cnt,head[N]; struct Edge {int to,nxt,len; }edge[N<<3]; void init() {for(int i=0;i<=n;i++) head[i]=-1;cnt=0; } void addEdge(int from,int to,int len) {edge[cnt].to=to;edge[cnt].len=len;edge[cnt].nxt=head[from];head[from]=cnt++; } struct Node {int p,len;Node(int p=0,int len=0):p(p),len(len){}bool operator < (const Node &b) const {return len>b.len;} }; std::priority_queue<Node> q; void dijkstra() {for(int i=1;i<=n;i++) d[i]=N;d[0]=0;q.push(Node(0,0));while(!q.empty()) {Node c=q.top();q.pop();if(d[c.p]<c.len) continue;for(int i=head[c.p];~i;i=edge[i].nxt) {int v=edge[i].to,w=c.len+edge[i].len;if(d[v]>w) d[v]=w,q.push(Node(v,d[v]));}} } void solve(int k) {init();for(int i=1;i<=m;i++) {if(op[i]==1) {if(x[i]>>k&1) addEdge(R[i],L[i]-1,-1);else addEdge(L[i]-1,R[i],0),addEdge(R[i],L[i]-1,0);}else {if(x[i]>>k&1) addEdge(L[i]-1,R[i],R[i]-L[i]+1),addEdge(R[i],L[i]-1,L[i]-1-R[i]);else addEdge(L[i]-1,R[i],R[i]-L[i]);}}for(int i=1;i<=n;i++) addEdge(i,i-1,0),addEdge(i-1,i,1);dijkstra();for(int i=1;i<=n;i++) a[i]|=(d[i]-d[i-1])<<k; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) scanf("%d%d%d%d",op+i,L+i,R+i,x+i);for(int i=0;i<20;i++) solve(i);for(int i=1;i<=n;i++) printf("%d%c",a[i],i<n?' ':'\n');return 0; }
转载于:https://www.cnblogs.com/BobHuang/p/8407316.html
Wannafly挑战赛9相关推荐
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- [Wannafly挑战赛2D-Delete]最短路
[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...
- Wannafly挑战赛19
Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...
- Wannafly挑战赛18
Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...
- Wannafly 挑战赛27 题解
Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...
- Wannafly挑战赛24
Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
- Wannafly挑战赛14 A-直角三棱锥
Wannafly挑战赛14 A-直角三棱锥 链接:https://www.nowcoder.com/acm/contest/81/A 来源:牛客网 题目描述 在三维空间中,平面 x = 0, y = ...
- Wannafly挑战赛27 C蓝魔法师
链接Wannafly挑战赛27 C蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于\(k\),\(n,k\leq 2*10^3\) 假设我们正在考虑\(i\)这个子树,那么 ...
- Wannafly挑战赛26-B 冥土追魂
地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...
最新文章
- 30005 rust_Steam三连冠老游戏《腐蚀(RUST)》为什么突然火起来了?
- stm32时钟树讲解
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- SQL数据定义、查询、更新+空值的处理 实践学习报告
- 富文本编辑器ckeditor的使用
- java面向对象(1)
- 从一次换机器的过程谈软硬件的分离
- 迭代子模式(Iterator)
- 给页面中的所有链接新窗口中打开
- 蓝桥杯 ADV-131算法提高 选择排序
- 使用LoadRunner进行性能测试的简单步骤
- (1)封装JSON数据的三种方式
- CSS-返回顶部代码
- [iOS开发]autolayout自动布局
- Java定时自动锁屏小程序_小程序 番茄时钟如何实现锁屏持续运行功能
- html嵌入flv格式和swf格式视频
- linux看caj文件格式,CAJ 文件扩展名: 它是什么以及如何打开它?
- 共享硬盘没有权限访问计算机,Win7系统打开磁盘共享说“没有访问权限
- office 论文 页码_Word中的论文页码怎么设置?
- 全球最小的一款P2P软件——eMuleBT软件框架分析