2017-0722 模拟赛

Digits

(digits.cpp/c/pas)

Description

给一个关于 的多项式,并给定一个 ,求该多项式在带入该 时的值最后 位数字。

Input

第一行两个整数 、 ;
之后的 行,每行两个数 和 ,表示多项式的一项 ;
最后一行一个整数 。
Output
输出 行,按顺序输出该多项式带入 后值的最后 位数字,若不足 位,则高位补零。
Example
digits.in digits.out
2 1
3 2
1 5
3
0
附加样例见选手目录下『digits』文件夹。
Hint
对于 的数据, ;
对于 的数据, 。

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 #define LL long long
 7 const int N(100005);
 8 LL n,k,x,a[N],b[N];
 9 LL tot,mod=1;
10 int ans[10];
11
12 LL Qpow(LL a,LL b)
13 {
14     LL ret=1,base=a;
15     for(;b;b>>=1)
16     {
17         if(b&1) ret=(ret*base)%mod;
18         base=(base*base)%mod;
19     }
20     return ret;
21 }
22
23 void read(LL &x)
24 {
25     LL ch=getchar();x=0;
26     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
27     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=ch-‘0‘+x*10;
28 }
29
30 int main()
31 {
32     freopen("digits.in","r",stdin);
33     freopen("digits.out","w",stdout);
34     read(n); read(k);
35     for(int i=1;i<=n;i++) read(a[i]),read(b[i]);
36     read(x);
37     for(int i=1;i<=k;i++) mod*=10;
38     for(int i=1;i<=n;i++) tot=(tot%mod+a[i]%mod*Qpow(x,b[i])%mod)%mod;
39     for(int i=k;i&&tot;i--) ans[i]=tot%10,tot/=10;
40     for(int i=1;i<=k;i++) printf("%d\n",ans[i]);
41     return 0;
42 }

Equation
(equation.cpp/c/pas)
Description
求方程 在 内有多少组正整数解。
Input
一行七个整数 。
Output
一行一个整数,原方程有多少正整数解。
Example
equation.in equation.out
10 -24 74 -25 22 -7 -22 5
附加样例见选手目录下『equation』文件夹。
Hint
对于 的数据,方程无解;
对于 的数据, ;
对于 的数据, 。

 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <map>
 4
 5 using namespace std;
 6
 7 #define LL long long
 8 int k,a[7],ans;
 9 LL tot,cx[666*666];
10 map<LL,LL>ma;
11
12 int main()
13 {
14     freopen("equation.in","r",stdin);
15     freopen("equation.out","w",stdout);
16     scanf("%d",&k);
17     for(int i=1;i<=6;i++) scanf("%d",a+i);
18     for(int x=1;x<=k;x++)
19       for(int y=1;y<=k;y++)
20         for(int z=1;z<=k;z++)
21         {
22             tot=a[1]*x+a[3]*y+a[5]*z;
23             ma[tot]++;
24         }
25     for(int x=1;x<=k;x++)
26       for(int y=1;y<=k;y++)
27         for(int z=1;z<=k;z++)
28         {
29             tot=a[2]*x+a[4]*y+a[6]*z;
30             ans+=ma[tot];
31         }
32     printf("%d",ans);
33     return 0;
34 }

Graph
( graph .cpp/c/pas)
Description
小 Y 又开始了一段旅途。
这次,他要经过一个图,从 号点到达 号点,每个点设有休息站。
小 Y 计划用最多 天走完全程,除第 天外,每一天小 Y 都必须在休息站过夜。所以,一段路
必须在同一天走完。
小 Y 的体力有限,他希望走的路程最大的一天中走的路尽可能少,请求出这个最小值。
Input
第一行三个整数 、 、 表示图的顶点数、边数、天数。
从第二行开始,之后的 行,每行三个整数 、 、 表示从 和 间有一条双向道路,长度
为 。
Output
一行一个正整数,如果小 Y 能走完全程,输出走的路程最大的一天中走的路程最小值,否则输
出 。
Example
graph.in graph.out
3 2 4
3 2 4
1 2 1
4
附加样例见选手目录下『graph』文件夹。
Hint
对于 的数据, ;
对于 的数据, ;
对于 的数据, , , ;
保证没有重边和自环。

  1 #include <algorithm>
  2 #include <cstdio>
  3
  4 using namespace std;
  5
  6 const int M(200005);
  7 const int N(7555);
  8 int n,m,k,u,v,w,ans=-1;
  9 void read(int &x)
 10 {
 11     int ch=getchar();x=0;
 12     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
 13     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=ch-‘0‘+x*10;
 14 }
 15
 16 int head[N],sumedge;
 17 struct Edge
 18 {
 19     int v,next,w;
 20     Edge(int v=0,int next=0,int w=0):
 21         v(v),next(next),w(w){}
 22 }edge[N<<1];
 23 void ins(int u,int v,int w)
 24 {
 25     edge[++sumedge]=Edge(v,head[u],w);
 26     head[u]=sumedge;
 27 }
 28 struct E
 29 {
 30     int u,v,w;
 31     E(int u=0,int v=0,int w=0): u(u),v(v),w(w){}
 32 }road[M];
 33 bool cmp(E a,E b)
 34 {
 35     return a.w<b.w;
 36 }
 37
 38 int cnt,fa[N];
 39 int find(int x)
 40 {
 41     return x==fa[x]?x:fa[x]=find(fa[x]);
 42 }
 43 bool K()
 44 {
 45     for(int i=1;i<=m;i++)
 46     {
 47         int u=road[i].u,fx=find(u);
 48         int v=road[i].v,fy=find(v);
 49         if(fx==fy) continue;
 50         cnt++;   fa[fx]=fy;
 51         ins(u,v,road[i].w);
 52         ins(v,u,road[i].w);
 53         if(cnt==n-1) return 1;
 54     }
 55     return 0;
 56 }
 57
 58 int deep[N],dis[N][25],dad[N][25];
 59 void DFS(int x)
 60 {
 61     deep[x]=deep[dad[x][0]]+1;
 62     for(int i=0;dad[x][i];i++)
 63     {
 64         dad[x][i+1]=dad[dad[x][i]][i];
 65         dis[x][i+1]=max(dis[x][i],dis[dad[x][i]][i]);
 66     }
 67     for(int i=head[x];i;i=edge[i].next)
 68     {
 69         int v=edge[i].v;
 70         if(deep[v]) continue;
 71         dad[v][0]=x;
 72         dis[v][0]=edge[i].w;
 73         DFS(v);
 74     }
 75 }
 76 int LCA(int x,int y)
 77 {
 78     int ret=0;
 79     for(int i=24;i>=0;i--)
 80         if(dad[x][i]!=dad[y][i])
 81         {
 82             ret=max(ret,max(dis[x][i],dis[y][i]));
 83             x=dad[x][i]; y=dad[y][i];
 84         }
 85     return max(ret,max(dad[x][0],dad[y][0]));
 86 }
 87
 88 int main()
 89 {
 90     freopen("graph.in","r",stdin);
 91     freopen("graph.out","w",stdout);
 92     read(n); read(m); read(k);
 93     for(int i=1;i<=m;i++)
 94     {
 95         read(u),read(v),read(w);
 96         road[i]=E(u,v,w);
 97     }
 98     sort(road+1,road+m+1,cmp);
 99     for(int i=1;i<=n;i++) fa[i]=i;
100     if(K()||find(1)==find(n))
101         DFS(1),ans=LCA(1,n);
102     printf("%d",ans);
103     return 0;
104 }

时间: 2024-11-08 16:59:33

2017-0722 模拟赛的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

2017.11.25【NOIP提高组】模拟赛A组

2017.11.25[NOIP提高组]模拟赛A组 T1 3467. [NOIP2013模拟联考7]最长上升子序列(lis) T2 3468. [NOIP2013模拟联考7]OSU!(osu) T3 3472. [NOIP2013模拟联考8]匹配(match) T1 有转移方程f[i]=max{f[j]}+1,a[j]<a[i] 可以用线段树+离散化维护这个方程,因为涉及以往状态可以用主席树维护 打太丑爆空间了 Code 1 #include<cstdio> 2 #include<c

2017.12.02【NOIP提高组】模拟赛A组

2017.12.02[NOIP提高组]模拟赛A组 T1 3555[GDKOI2014模拟]树的直径 T2 3542[清华集训2014]冒泡排序 T3 3486[NOIP2013模拟联考10]道路改建(rebuild) T1 树直径的一个性质,两棵树合并,形成新的树的直径的两个端点为原树中的四个端点之二. 可以用反证法证明.用此性质本题就变成了lca裸题了 Code #include<cstdio> #include<cstring> #include<cmath> #i

2017.12.09【NOIP提高组】模拟赛A组

2017.12.09[NOIP提高组]模拟赛A组 T1 3489. [NOIP2013模拟联考11]数列的GCD(gcd) T2 3500.[NOIP2013模拟联考15]物语(monogatari) T3 3501.[NOIP2013模拟联考15]消息传递(news) 吐槽:这次的题好像有点水啊,但最简单的第二题都给打挂啦!!(数组开小了) T1 本套题中最难的题.考虑dp 设f[i]是b[1],b[2]...b[N]的最大公约数的数目,g[i]是b[1],b[2]...b[N]的公约数的数目

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

2017 GDCPC 省赛总结

第一年参加省赛,也是我接触acm半年多的第一个正式省级赛事,这半年来我为acm付出的可能很多,但经历过这次省赛后,给我唯一的感觉就是,还不够多. 直接分析题目吧,开始拿到试题后我读的是A题,然后我的队友好像是开始读BC,我读完A题就确定这是一道水题,然后没多加分析就开始写了,中间过程有很多的差错,导致我们差不多30多分钟才2A了这道水题,之前的一次WA是因为少输出了一个#号--.总而言之还是不太习惯这种大赛场面,由于被各种高校包围,所以我们全场基本都是在吵杂的讨论声度过的,导致读题及其难以专心.

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y):