链接:https://www.nowcoder.com/acm/contest/160/A
来源:牛客网

题目描述

有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能。

    令 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条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' 结尾,中间都是小写字母,小写字母可以为0个。

输入描述:

第一行两个整数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
来源:牛客网

题目描述

给出一个长度为n的整数序列a1,a2,...,an,进行m次操作,操作分为两类。
操作1:给出l,r,v,将al,al+1,...,ar分别加上v;
操作2:给出l,r,询问
 
 
 
 
 
        利用正弦和的公式  sin(a+b)=sin(a)cos(b)+cos(a)sin(b)   cos(a+b)=cos(a)cos(b)-sin(a)sin(b),区间维护sin和cos的和。我在update函数里
一直没有写标记下方函数,后来才发现>_< ,标记是一定要下放的,之前没有考虑过这个问题,现在想想确实是这样,因为子区间更新完要pushup一下,
如果标记没有下放那么保存的结果在pushup的时候就会发生变化了,缺少了标记代表的值。
    

 #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的更多相关文章

  1. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  2. Wannafly挑战赛 22

    爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...

  3. Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询

    题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...

  4. 多项式 Wannafly挑战赛22

    后缀表达式 大整数(加法.乘法.gcd java) import java.math.BigInteger; import java.util.Scanner; class Work { String ...

  5. Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)

    原题地址 题目描述 有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能. 输入描述: ...

  6. Wannafly挑战赛22

    B. 字符路径 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符,问图上有几条路径满足路径上经过的边上的字符组成的的字符串去掉空格后以大写字母开头,句号 '.' ...

  7. Wannafly挑战赛22 C 多项式(大数,多项式极限)

    链接:https://ac.nowcoder.com/acm/contest/160/C 来源:牛客网 多项式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  8. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)

    链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  9. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )

    链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...

  10. Wannafly挑战赛13 zzf的好矩阵 题解 答案解释

    Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...

随机推荐

  1. ZooKeeper分布式过程协同技术详解2——了解ZooKeeper

    这个服务如何实现这些协作方面的原语? ZooKeeper基础

  2. C#题目及答案(2)

    1. NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术. C#是一种编程语言,可以基于.NET平台的应用. 2.一列数的规则如下: 1.1.2.3. ...

  3. Linux的vi编辑器笔记

    vi编辑器,全称是visual interface,可以执行输出.删除.查找.替换等众多的文本操作. vi并不是一个排版程序,不可以对字体.格式.段落等其他的属性进行编排. vi是全屏文本编辑程序,没 ...

  4. cookie 简单用法

    cookie 简单用法 //当前登录人的组织Id HttpCookie SingleValueCookie = new HttpCookie("DepartmentId", &qu ...

  5. 【Python】图形界面

    # [[图形界面]]'''Python支持多种图形界面的第三方库,包括TkwxWidgetsQtGTK但是Python自带的库是支持Tk的Tkinter,无需安装任何包,可直接使用.''' #[Tki ...

  6. spring boot Tomcat访问日志

    1.Tomcat设置访问日志 <Host name="localhost" appBase="webapps" unpackWARs="true ...

  7. MongoDB 对象操作

    对象插入 >db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: 'xxx', url: ' ...

  8. Oracel中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  9. XML简单入门

    1.xml文件的第一句为<?xml version="1.0" ?> xml 1.0版本和1.1版本有较大不同,且1.1版本向下不可兼容,故使用version 1.0 ...

  10. Spring官网下载各版本jar包

    1:浏览器输入官网地址:http://spring.io/projects 2:点击如图树叶页面按钮.  3:点击如图小猫图片按钮.  4:查找downloading spring artifacts ...