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

  1. 六省联考2017 Day2

    目录 2018.3.27 Test 总结 T1 T2 T3 BZOJ.4873.[六省联考2017]寿司餐厅(最小割ISAP 最大权闭合子图) 考试代码 T1 T2 T3 2018.3.27 Test ...

  2. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)

    szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...

  3. NOIp2018集训test-9-7(pm) (联考一day1)

    又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...

  4. NOIp2018集训test-9-16(联考二day2)

    T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中 ...

  5. NOIp2018集训test-10-22 (联考六day2)

    中间值 两个log肯定会被卡.我用的第一种做法,就是要各种特判要在两个序列都要二分比较麻烦. //Achen #include<bits/stdc++.h> #define For(i,a ...

  6. NOIp2018集训test-10-24(am&pm)

    李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...

  7. NOIp2018集训test-9-15(联考二day1)

    T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...

  8. ZR10.1青岛集训三地联考

    ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...

  9. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

随机推荐

  1. mac 命令行

    本文为使用到过的命令行,仅方便自己查阅 1.进入目录文件 cd name name为文件名 2.返回上一级目录 cd ../ 3.创建文件夹 mkdir name 4.删除文件夹(文件夹下不能包含文件 ...

  2. The 'with' and 'as' Keywords

    Programming is all about getting the computer to do the work. Is there a way to get Python to automa ...

  3. SpringBoot项目部署初体验【Docker】

    前言 一个微服务项目,小到几个模块,大到十几二十几个模块,每个模块都是单独的SpringBoot工程,这么多模块的部署,部署成本真的很高,而且每个服务的部署,都是手动部署,打成war或者jar ?,一 ...

  4. 线性dp——1197D

    一开始没有什么头绪,后来注意到m<=10,考虑是否可以用dp[i][j]表示第i位,前面跟了j个数的最大值 那么第i+1个数,直接和第i个数的[0,m]的m+1种状态去转移即可,如果是由0或m状 ...

  5. delphi INI文件

    INI 文件读写 filecreate('路径加文件名')://创建一个文件. (1) INI文件的结构: ;这是关于INI文件的注释部分 [节点] 关键字=值 ... INI文件允许有多个节点,每个 ...

  6. NX二次开发-Block UI C++界面Toggle(开关)控件的获取(持续补充)

    NX9+VS2012 public: void SetBlockUIShow(); void ToggleInt::SetBlockUIShow() { //获取开关控件 //获取枚举控件 Prope ...

  7. 排序算法(一) 插入排序及Java实现

    代码实现: public void insertionSort(List<T> list, Comparator<T> comparator) { for (int i=1; ...

  8. I. Five Day Couple--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

    题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/H来源:牛客网 题目描述 ...

  9. MVC 中对返回的 data 进行压缩

    在webAPI 中返回数据,在数据量比较大的情况的下,返回的data 也可能比较大,有时候可能大于1兆,因此对数据进行压缩能极大的提高数据下载到客户端的时间,提高页面的加载速度. 思路: 在web a ...

  10. Java 序列化和反序列化(三)Serializable 源码分析 - 2

    目录 Java 序列化和反序列化(三)Serializable 源码分析 - 2 1. ObjectStreamField 1.1 数据结构 1.2 构造函数 2. ObjectStreamClass ...