Wannafly挑战赛22-A/B/C
链接:https://www.nowcoder.com/acm/contest/160/A
来源:牛客网
题目描述
令 g=gcd(a1,a2,,,,,,an) ,显然 (k*g)%m 的不同个数就是答案,观察之后发现这个式子是有循环节的,假设第一次出现循环的
位置是x,也就是说 x*g=0 (mod m) x*g+y*m=0 ,x的解 x=x0+k*(m/gcd(g,m)) ,其实答案就是 m/(gcd(g,m)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdlib>
#include<map>
#include<set> #include<bits/stdc++.h>
using namespace std; #define LL long long
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
LL gcd(LL a,LL b){
return b==?a:gcd(b,a%b);
}
int main(){
int t,n,m,i,j,k;
while(scanf("%d%d",&n,&m)!=EOF){
LL ans=m,a;
for(i=;i<=n;++i){
scanf("%lld",&a);
ans=gcd(ans,a);
}
cout<<m/ans<<endl;
}
return ;
}
链接:https://www.nowcoder.com/acm/contest/160/B
来源:牛客网
题目描述
输入描述:
第一行两个整数n,m
接下来m行,每行两个整数a,b和一个字符c,表示一条起点为a,终点为b的边,边上的字符是c
1 ≤ n, m ≤ 50000
1 ≤ a < b ≤ n
c可以是大小写字母、句号 '.' 或空格(方便起见用 '_' 表示空格)
ps:我想的复杂了,有个更简单的dp是 f[i][0/1/2/3]表示第i个节点结尾的,符号是j类型的合法子串的数目,这样就好写多了>_<.
先对这个DAG进行拓扑排序。
设置四个类型 0-[A-Z] 1-[a-z] 2-[.] 3-[_] f[j][k1][k2]表示以第j个字符结尾的,开头是k1类型,结尾是k2类型的合法串的个数,答案就是SUM{f[i][0][2]}。转移的时候如果多个'_'连着算作一个就好了,如果有合法串与"__"拼接,那么直接略去'_'即可,也就是说长度大于1的串中不显示'_',单独设置类型4只用作表示开头指代这个状态的子串长度是1.转移的时候我直接枚举所有情况,所以写的很长,其实很多状态都是无用的,但分析起来怕出错就直接写了。我转移的时候忘记了小写字母可以不存在,,比赛结束5min才发现然后1A......
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdlib>
#include<map>
#include<set> #include<bits/stdc++.h>
using namespace std; #define LL long long
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define uint unsigned int
uint f[][][]={};
vector<pii>e[];
vector<int>vi;
int in[];
void topsort(int n){
queue<int>q;
for(int i=;i<=n;++i){
if(!in[i]) {q.push(i);vi.push_back(i);}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=;i<e[u].size();++i){
pii _e=e[u][i];
if(!(--in[_e.first])){
q.push(_e.first);
vi.push_back(_e.first);
}
}
}
//for(i=0;i<n;++i)cout<<vi[i]<<endl;
}
void solve(int n){
uint ans=;
for(int i=;i<n;++i){
int u=vi[i];
for(int j=;j<e[u].size();++j){
f[e[u][j].first][][e[u][j].second]++;
}
for(int k1=;k1<=;k1++){
for(int k2=;k2<;++k2){
if(f[u][k1][k2]){
//cout<<u<<' '<<k1<<' '<<k2<<' '<<f[u][k1][k2]<<endl;
for(int j=;j<e[u].size();++j){
//cout<<u<<' '<<e[u][j].first<<endl;
uint s=f[u][k1][k2];
if(e[u][j].second==){
if(k1==){
if(k2==)
f[e[u][j].first][][]+=s;
}
}
else if(e[u][j].second==){
if(k1==){
if(k2==){
f[e[u][j].first][][]+=s;
}
else if(k2==){
f[e[u][j].first][][]+=s;
}
}
else{
if(k1!=)continue;
if(k2==)
f[e[u][j].first][][]+=s;
}
}
else if(e[u][j].second==){
if(k1==){
if(k2==){
f[e[u][j].first][][]+=s;
}
}
else{
if(k1!=)continue;
if(k2==){
f[e[u][j].first][][]+=s;
}
}
}
else{
if(k1==){
if(k2==){
f[e[u][j].first][][]+=s;
}
else if(k2==){
f[e[u][j].first][][]+=s;
}
}
else{
if(k1!=)continue;
if(k2==){
f[e[u][j].first][][]+=s;
}
else if(k2==){
f[e[u][j].first][][]+=s;
}
}
}
}
}
}
}
}
for(int i=;i<=n;++i)ans+=f[i][][];
cout<<ans<<endl;
}
int main(){
int n,m;
int u,v,w;
char c;
cin>>n>>m;
while(m--){
//scanf("%d%d%c",&u,&v,&c);
cin>>u>>v>>c;
if(c>='A'&&c<='Z') w=;
else if(c>='a'&&c<='z') w=;
else if(c=='.') w=;
else w=;
in[v]++;
e[u].push_back(mp(v,w));
}
topsort(n);
solve(n);
return ;
}
链接:https://www.nowcoder.com/acm/contest/160/D
来源:牛客网
题目描述
操作1:给出l,r,v,将al,al+1,...,ar分别加上v;
操作2:给出l,r,询问
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdlib>
#include<map>
#include<set> #include<bits/stdc++.h>
using namespace std; #define LL long long
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define mid ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
const int maxn=;
double SIN[maxn<<],COS[maxn<<];
LL tag[maxn<<]; void calc(int id,LL x){
double t1=SIN[id],t2=COS[id],t3=sin(x),t4=cos(x);
SIN[id]=t1*t4+t2*t3;
COS[id]=t2*t4-t1*t3;
}
void pushup(int id){
SIN[id]=SIN[lc]+SIN[rc];
COS[id]=COS[lc]+COS[rc];
}
void pushdown(int id,int L,int R){
if(tag[id]){
calc(lc,tag[id]),calc(rc,tag[id]);
tag[lc]+=tag[id],tag[rc]+=tag[id];
tag[id]=;
}
}
void build(int id,int L,int R){
if(L==R){
LL x;scanf("%lld",&x);
SIN[id]=sin(x),COS[id]=cos(x);
return ;
}
build(lc,L,mid);
build(rc,mid+,R);
pushup(id);
}
void add(int id,int L,int R,int l,int r,LL v){
if(L>=l&&R<=r){
calc(id,v);
tag[id]+=v;
return;
}
pushdown(id,L,R);
if(l<=mid)add(lc,L,mid,l,r,v);
if(r>mid) add(rc,mid+,R,l,r,v);
pushup(id);
}
double ask(int id,int L,int R,int l,int r){
if(L>=l&&R<=r){
return SIN[id];
}
pushdown(id,L,R);
if(r<=mid) return ask(lc,L,mid,l,r);
else if(l>mid) return ask(rc,mid+,R,l,r);
else return ask(lc,L,mid,l,r)+ask(rc,mid+,R,l,r);
}
int main(){
LL n,m,i,j,k,l,r;
LL v;
cin>>n;
build(,,n);
cin>>m;
while(m--){
scanf("%d",&k);
if(k==){
scanf("%d%d%lld",&l,&r,&v);
add(,,n,l,r,v);
}
else{
scanf("%d%d",&l,&r);
printf("%.1f\n",ask(,,n,l,r));
}
}
return ;
}
/*
4
1 2 3 4
5
2 1 4
1 1 4 1
2 1 4
*/
Wannafly挑战赛22-A/B/C的更多相关文章
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- Wannafly挑战赛 22
爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 多项式 Wannafly挑战赛22
后缀表达式 大整数(加法.乘法.gcd java) import java.math.BigInteger; import java.util.Scanner; class Work { String ...
- Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)
原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: ...
- Wannafly挑战赛22
B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...
- Wannafly挑战赛22 C 多项式(大数,多项式极限)
链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...
- Wannafly挑战赛13 zzf的好矩阵 题解 答案解释
Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...
随机推荐
- [HDU 1215] 七夕节(求因子,不超时)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215 //注意怎么处理不超时 #include<iostream> #include< ...
- Redis架构设计
高可用Redis服务架构分析与搭建 各种web开发业务中最为常用的key-value数据库了 应用: 在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度 ...
- Jenkins简介
Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和 ...
- DPDK安装方法 17.12.13
DPDK安装方法 17.12.13 Ubuntu: $ git clone https://github.com/DPDK/dpdk.git $ cd dpdk/ $ export RTE_ARCH= ...
- 4、My Scripts
脚本目录列表 1.在windows编写的shell脚本利用dos2unix命令格式化一下(P308) 2.bash命令参数调试(P309) 3.使用set命令调试部分脚本内容(P312) 4.开发脚本 ...
- 异步编程- async和await
使用目的 避免阻塞主线程 提高程序响应能力 C#中使用 C# 中的 Async 和 Await 关键字是异步编程的核心. 疑惑 The async and await keywords don't c ...
- Dalvik VM 和JVM的比较
避免出现版权问题android重写JVM 两者在编译后的文件格式区别: JVM: .java->.class->.jar DALVIK VM:.java->.class->.d ...
- 理解 Redis(9) - Publish Subscribe 消息订阅
在窗口1开通一个名为 redis 的通道: 127.0.0.1:6379> SUBSCRIBE redis Reading messages... (press Ctrl-C to quit) ...
- git 修改文件夹名字后如何提交
将文件夹名字从 v1.0.1 修改为 v1.0.2 git add --ignore-removal "v1.0.2/xsxsx"
- 堆排序 java实现
import java.util.Arrays; /* * 思路: * 1.方法adjustDown:对于一个数组a[],针对第i个数进行向下(直到len-1)调整,使得该位置成为大顶堆 * 2.方法 ...