NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做。然后打了t2,常数不优秀。然后去打t3,lct,结果打挂爆0了。
然后今天就爆炸了。
如果这是noip我今年就可以直接回去学常规了。学常规多好,多开心。
今天考完llj同学又来机房“羞辱(杯哥曰)”我这个zz,用大概5min就AK了这套题,我真是菜哭自己了。。
T1锻造
这tm不是个傻逼题吗。我tm没有看到y=max(0,x-1),然后我以为要枚举y然后取min。然后我推了一推,发现是个凸壳的形式倒是可以O(n)做,问题是取摸怎么tm取min啊??我就很懵逼地又推了半天没有任何进展。
结果每个x由x-1,x-2锻造来,随便写写方程,1的时候特殊处理就好了。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e7+,p=;
typedef long long LL;
typedef double db;
using namespace std;
int n,b[N],c[N],f[N],inv[N];
LL a,bx,by,cx,cy,pp; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define ANS
int main() {
#ifdef ANS
freopen("forging.in","r",stdin);
freopen("forging.out","w",stdout);
#endif
read(n); read(a);
read(bx); read(by); read(cx); read(cy); read(pp);
b[]=by+;c[]=cy+;
for(int i=;i<n;i++){
b[i]=((LL)b[i-]*bx+by)%pp+;
c[i]=((LL)c[i-]*cx+cy)%pp+;
}
inv[]=inv[]=;
For(i,,pp) inv[i]=(p-(LL)p/i*inv[p%i]%p)%p;
f[]=a;
f[]=((LL)c[]*inv[min(b[],c[])]%p+)*a%p;
For(i,,n)
f[i]=((LL)f[i-]+(LL)f[i-]*c[i-]%p*inv[min(c[i-],b[i-])]%p)%p;
printf("%d\n",f[n]);
Formylove;
}
------------------18-9-11upd--------------------
其实是T2的upd,写错位置懒得改了
积性筛是什么辣鸡算法??我的辣鸡电脑跑std2s才出答案,看llj200倍吊打标解
求x^(m-1)=1(mod p)的x的个数,x=g^a(g为原根),原式化成g^(a*(m-1))=1(mod p),因为g^(p-1)=1(mod p),a*(m-1)=k*(p-1),一个gcd解决问题。
只需把积性筛换成一行solve
LL solve(int P,int m) { return gcd(m-1,P-1); }
ORZ ORZ ORZ
我跟llj之间大概隔着几个世纪的代沟
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e4+,mod=;
typedef long long LL;
typedef double db;
using namespace std;
int id,T;
LL c,m; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL ksm(LL a,LL b,LL p) {
LL rs=,bs=a%p;
while(b) {
if(b&) rs=rs*bs%p;
bs=bs*bs%p;
b>>=;
}
return rs;
} int gcd(int a,int b) { return !b?a:gcd(b,a%b); } LL solve(int P,int m) { return gcd(m-,P-); } #define ANS
int main() {
#ifdef ANS
freopen("division.in","r",stdin);
freopen("division.out","w",stdout);
#endif
read(id);
read(T);
while(T--) {
read(c); read(m);
int pp;
if(m==) {
LL ans=;
For(i,,c) {
read(pp);
ans=ans*pp%mod;
}
printf("%lld\n",ans);
}
else if(m==) {
For(i,,c) read(pp);
printf("%lld\n",ksm(,c,mod));
}
else {
LL ans=,tot=;
For(i,,c) {
read(pp);
tot=solve(pp,m);
ans=ans*(tot+)%mod;
}
printf("%lld\n",ans);
}
}
Formylove;
}
T2整除
式子拆开就是x^(m-1)=1(mod pi) 或x==0 (mod pi)
枚举1~pi中满足条件的数,其他满足条件数就是在mod pi意义下于这些数同余。
那么可以得到c个x mod pi = bi同余方程,x在mod p1*p2*p3……pc意义下有唯一解。于是答案就是同余方程组的个数。也就是每个pi找到的1~pi中满足条件的数的个数+1的乘积。
这样就可以得到80分啦。
然后a^k还用暴力算吗??这是积性函数啊,线筛就好了我是个zz吧。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e4+,mod=;
typedef long long LL;
typedef double db;
using namespace std;
int id,T;
LL c,m; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL ksm(LL a,LL b,LL p) {
LL rs=,bs=a%p;
while(b) {
if(b&) rs=rs*bs%p;
bs=bs*bs%p;
b>>=;
}
return rs;
} int bo[N],p[N],f[N];
LL solve(int P,int m) {
memset(bo,,sizeof(bo)); p[]=;
f[]=;
int rs=;
For(i,,P) {
if(!bo[i]) {
p[++p[]]=i;
f[i]=ksm(i,m-,P);
}
for(int j=;j<=p[]&&i*p[j]<=P;j++) {
bo[i*p[j]]=;
f[i*p[j]]=(LL)f[i]*f[p[j]]%P;
if(i%p[j]==) break;
}
if(f[i]==) rs++;
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("division.in","r",stdin);
freopen("division.out","w",stdout);
#endif
read(id);
read(T);
while(T--) {
read(c); read(m);
int pp;
if(m==) {
LL ans=;
For(i,,c) {
read(pp);
ans=ans*pp%mod;
}
printf("%lld\n",ans);
}
else if(m==) {
For(i,,c) read(pp);
printf("%lld\n",ksm(,c,mod));
}
else {
LL ans=,tot=;
For(i,,c) {
read(pp);
tot=solve(pp,m);
ans=ans*(tot+)%mod;
}
printf("%lld\n",ans);
}
}
Formylove;
}
T3欠钱
法1:lct
其实我并不知道怎么做
法2:llj一眼就看出来的,然而我又不会。
法3
:
菜如我只会最傻逼的做法。启发式合并我用并查集记集合的大小,然后de了一下午,1是一次倍增的时候y写成了x,2是查询的时候没有考虑两个块不连通的情况,3是因为倍增数组一直在变,可能以前能到更深的地方现在到不了了,但是那里的数字还记着,查询到了就GG了,所以每次查询的时候要根据当前深度判断一下这个地方是不是现在可以到的。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define inf 1e9
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e5+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int ecnt,fir[N],nxt[N<<],to[N<<],val1[N<<],val2[N<<];
void add(int u,int v,int w) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val1[ecnt]=w; val2[ecnt]=;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u; val1[ecnt]=w; val2[ecnt]=-;
} int fa[N],sz[N];
int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } int R[N],f[N][],g[N][],h[N][];
void dfs(int x,int fa) {
For(i,,) {
f[x][i]=f[f[x][i-]][i-];
if(!f[x][i]) break;
g[x][i]=min(g[x][i-],g[f[x][i-]][i-]);
h[x][i]=h[x][i-]+h[f[x][i-]][i-];
}
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
R[to[i]]=R[x]+;
f[to[i]][]=x;
g[to[i]][]=val1[i];
h[to[i]][]=val2[i];
dfs(to[i],x);
}
} void merge(int x,int y,int z) {
add(x,y,z);
int gg=z,hh=;
int rtx=find(x),rty=find(y);
if(sz[rtx]<sz[rty]) swap(x,y),swap(rtx,rty),hh=-;
R[y]=R[x]+; f[y][]=x; g[y][]=gg; h[y][]=hh;
dfs(y,x);
sz[rtx]+=sz[rty];
fa[rty]=rtx;
} int lca(int x,int y) {
if(R[x]<R[y]) swap(x,y);
Rep(i,,) if(R[x]>=(<<i)+&&R[f[x][i]]>=R[y])
x=f[x][i];
if(x==y) return x;
Rep(i,,) if(R[x]>=(<<i)+&&f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][];
} int qry(int x,int y) {
if(find(x)!=find(y)) return ;
int z=lca(x,y),sum=;
int ans=inf,L=R[x]+R[y]-*R[z];
Rep(i,,) if(R[x]>=(<<i)+&&R[f[x][i]]>=R[z]) {
ans=min(ans,g[x][i]);
sum+=h[x][i];
x=f[x][i];
}
Rep(i,,) if(R[y]>=(<<i)+&&R[f[y][i]]>=R[z]) {
ans=min(ans,g[y][i]);
sum-=h[y][i];
y=f[y][i];
}
if(sum!=L) ans=;
return ans;
} #define ANS
int main() {
#ifdef ANS
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) fa[i]=i,sz[i]=,R[i]=;
For(i,,m) {
int o,a,b,c;
read(o);
if(!o) {
read(a); read(b); read(c);
a=(a+ans)%n+;
b=(b+ans)%n+;
c=(c+ans)%n+;
merge(b,a,c);
}
else {
read(a); read(b);
a=(a+ans)%n+;
b=(b+ans)%n+;
ans=qry(a,b);
if(ans==) {
int debug=;
}
printf("%d\n",ans);
}
}
Formylove;
}
/*
5 10
0 4 3 1
0 3 2 3
0 2 1 6
0 5 2 1
1 4 1
*/
NOIp2018集训test-9-8(pm) (联考一day2)的更多相关文章
- 六省联考2017 Day2
目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- NOIp2018集训test-9-7(pm) (联考一day1)
又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...
- NOIp2018集训test-9-16(联考二day2)
T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...
- NOIp2018集训test-10-22 (联考六day2)
中间值 两个log肯定会被卡.我用的第一种做法,就是要各种特判要在两个序列都要二分比较麻烦. //Achen #include<bits/stdc++.h> #define For(i,a ...
- NOIp2018集训test-10-24(am&pm)
李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...
- NOIp2018集训test-9-15(联考二day1)
T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...
- ZR10.1青岛集训三地联考
ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...
- luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)
luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...
随机推荐
- nginx自动切割日志脚本
#!/bin/bash savepath_log='/data/logs' nglogs='/data/logs' mkdir -p $savepath_log/$(date +%Y)/$(date ...
- 1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写
总结: 1. 在继承上, new/override没区别 2. 在多态上,new不支持多态,override支持 在C#中改变类中相同名称的方法的实现过程中有三种方式:重载.重写和覆盖. 重载:指具有 ...
- Scala(一)基础
OOP 面向对象编程 AOP 面向切面编程 FP 函数式编程 编程语言都要定义变量,一些代码是用来注释的,变量和变量之间有一些关系,要做一些运算,运算离不开流程控制,进行运算的数据往往来自数据结构,最 ...
- v-model 双向数据绑定以及修饰符
<!--v-model 实现双向数据绑定 其中一个值发生改变,另一个值也将实时发生改变--> <div id="app09"> <h1>{{ m ...
- Redis Cluster集群详介绍和伪集群搭建
1 什么是Redis-Cluster 为何要搭建Redis集群.Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系 ...
- centos 安装 ImageMagick
ImageMagick很好用,shell下可以批量对图片做处理,很赞!~ 编译安装 wget http://www.imagemagick.org/download/ImageMagick.tar.g ...
- 3.2 Redux TodoApp
上一节讲完了 redux 中的概念,但是仍然没有和 react 联系起来,这一节将利用 redux 在 react 中实现完整的 todolist: 在 react 使用 redux 通过 Provi ...
- VS下使用VIM, Visual Studio 安装 VSvim插件 配置 及使用
简介 VIM是一款很高效的编辑工具,所幸的是VS2012以后支持VIM的插件:VsVim.下面介绍插件的安装.配置及简单使用. 1. 下载安装 去官网下载,双击直接安装后,重新打开VS. https: ...
- mysql优化3:BTree索引和Hash索引
一.BTree索引 注:名叫btree索引,大的方面看,都用的平衡树,但具体的实现上,各引擎稍有不同,比如,严格地说,NDB引擎使用的是T-tree,Myisam和innodb中默认用B-tree索引 ...
- Java传输对象模式
当我们想要在客户端到服务器的一个传递具有多个属性的数据时,可使用传输对象模式.传输对象也称为值对象.传输对象是一个具有getter/setter方法的简单POJO类,并且是可序列化的,因此可以通过网络 ...