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 ...
随机推荐
- Spring Boot 2.0 常见问题总结(一)
SpringBoot2.x 依赖环境和版本新特性说明 依赖版本 jdk8 以上, Springboot2.x 用 JDK8 , 因为底层是 Spring framework5 . jar 包方式运行 ...
- Java高并发网络编程(三)NIO
从Java 1.4开始,Java提供了新的非阻塞IO操作API,用意是替代Java IO和Java Networking相关的API. NIO中有三个核心组件: Buffer缓冲区 Channel通道 ...
- YII 中加入短信接口的函数
public function smsto($telphone,$message) { //短信接口用户名 $uid,如果没有或不能发送请与客服联系 $uid = 'zyd'; //短信接口密码 $p ...
- ac自动机暴力跳fail匹配——hdu5880
很简单的题,ac自动机里再维护一个len表示每个状态的串长,用s去query时每到一个结点都要暴力跳fail,因为有可能这个结点不是,但是其fail是危险结点,找到一个就直接break 再用个差分数组 ...
- (转)OpenFire源码学习之二:Mina基础知识
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413009 Mina概述 Apache MINA(Multipurpose Infra ...
- java求两个数中的大数
java求两个数中的大数 java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45.
- android studio import cannot resolve symbol错误
试了好多,都不行 经过查阅和测试,发现如果上文的解决方式不可以的话,可以使用另一种: 删除项目.idea目录下的libraries目录 重新启动Android Studio 感谢作者:https:// ...
- 【C++】清空一个C++栈的快速方法
来源:https://stackoverflow.com/questions/40201711/how-can-i-clear-a-stack-in-c-efficiently/40201744 传统 ...
- PAT_A1012#The Best Rank
Source: PAT A1012 The Best Rank (25 分) Description: To evaluate the performance of our first year CS ...
- leetcode 596 BUG笔记
There is a table courses with columns: student and class Please list out all classes which have more ...