Za 2019.8.30
SDOI2011 计算器
1、给定y、z、p,计算y^z mod p 的值;
2、给定y、z、p,计算满足xy ≡z(mod p)的最小非负整数x;
3、给定y、z、p,计算满足y^x ≡z(mod p)的最小非负整数x。
第一个要求直接快速幂
第二个要求因为保证P为质数 直接费马小定理求逆元然后*z
第三个就是BSGS模板
==打的时候1mol错 要注意该加括号的就加括号 不要图简便啥的不加 然后就long long
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
#define Abs(x) ((x)<0?-(x):(x))
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
const int N=10000+5,M=20000+5,INF=1e9+7,inf=0x3f3f3f3f;
int y,z,p;
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int qpow(int a,int b){
int res=1;
while(b){
if(b&1) res=(ll)a*res%p;
a=(ll)a*a%p,b>>=1;
}
return res;
}
map<int,int>hash;
int BSGS(){
hash.clear();y%=p,z%=p;
if(!y) return -1;
int t=(int)sqrt(p)+1;
for(int j=0,val;j<t;++j)
val=(ll)z*qpow(y,j)%p,hash[val]=j;
y=qpow(y,t);
if(!y) return !z?1:-1;
for(int i=0,val,j;i<=t;++i){
val=qpow(y,i);
j=hash.find(val)==hash.end()?-1:hash[val];
if(j>=0&&i*t-j>=0) return i*t-j;
}
return -1;
}
void work2(){
if(!(y%p)&&z%p) puts("Orz, I cannot find x!");
else printf("%lld
",(ll)qpow(y,p-2)*z%p);
}
void work3(){
int ans=BSGS();
if(ans==-1) puts("Orz, I cannot find x!");
else printf("%d
",ans);
}
int main(){
freopen("in.txt","r",stdin);
int T,K;rd(T),rd(K);
while(T--){
rd(y),rd(z),rd(p);
if(K==1) printf("%d
",(qpow(y,z))%p);
else if(K==2) work2();
else work3();
}
return 0;
}
luogu4884 多少个1?
给定整数(K)和质数(m),求最小的正整数(N),使得 (1111⋯1(N个1)equiv K(mod;m))
说人话:就是(111...1111; mod;m =K)
将(1111⋯1(N个1))乘9得(9999⋯9(N个9))再(+1)得(10^N)
即求x使得(10^xequiv K*9+1(mod;m))
题解里的玄学快速乘
好像noip啥的不支持_int128 那就先不学了
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
#define Abs(x) ((x)<0?-(x):(x))
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
const int N=10000+5,M=20000+5,INF=1e9+7,inf=0x3f3f3f3f;
ll y,z,p;
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
ll mul(ll a, ll b){
ll L = a * (b >> 25LL) %p* (1LL << 25) %p;
ll R = a * (b & ((1LL << 25) - 1)) %p;
return (L + R) %p;
}
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=mul(a,res)%p;
a=mul(a,a)%p,b>>=1;
}
return res;
}
map<ll,int>hash;
ll BSGS(){
hash.clear();
y%=p,z%=p;
int t=sqrt(p)+1;
for(int i=0;i<t;++i){
ll val=mul(z,qpow(y,i))%p;
hash[val]=i;
}
y=qpow(y,t);
if(!y) return !z?1:-1;
for(int i=0,j;i<=t;++i){
ll val=qpow(y,i);
j=hash.find(val)==hash.end()?-1:hash[val];
if(j>=0&&(ll)i*t-j>=0) return (ll)i*t-j;
}
return -1;
}
int main(){
freopen("in.txt","r",stdin);
rd(z),rd(p);
y=10ll,z=(z<<3)+z+1;
ll ans=BSGS();
printf("%lld",ans);
return 0;
}
exbsgs
银河英雄传说
重新打了一遍
带权并查集
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define Abs(x) ((x)<0?-(x):(x))
const int N=30000+5,M=20000+5,INF=1e9+7,inf=0x3f3f3f3f;
int n,f[N];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int d[N],sz[N];
int find(int x){
if(x==f[x]) return x;
int rt=find(f[x]);
d[x]+=d[f[x]];
return f[x]=rt;
}
void Merge(int x,int y){
f[x=find(x)]=y=find(y),d[x]=sz[y],sz[y]+=sz[x];
}
int main(){
freopen("in.txt","r",stdin);
int T,x,y;char opt[5];
rd(T);
for(int i=1;i<=30000;++i) f[i]=i,sz[i]=1;
while(T--){
scanf("%s",opt);rd(x),rd(y);
if(opt[0]=='M') Merge(x,y);
else{
if(find(x)!=find(y)) puts("-1");
else printf("%d
",Abs(d[x]-d[y])-1);
}
}
return 0;
}
1930来的先生
卿卿吾愛,見字如晤:
體無恙否?心安樂否?藝人之工作順利否?
屈指算來,吾與汝七日未見,人言一日不見,如隔三秋,七日之長,煎熬甚苦。人生苦短如斯,言語小恚,便有這許多煎熬,若他日真作計較,又當何以自處?思來想去,日夜翻覆,更覺會日何短,隔日何長?憂思何繁,歡顏何驟?
吾心愛汝,願見歡顏,恨吾怨吾,皆吾自取。當日失言,悔之不及。前日電訊致歉,卿定有閱之,閱而不復,非卿之過,是吾書未達意,辭未達情。游目天地,何以悅卿?雖天涯海角,卿所樂之,吾必往之,幽王癡情,敢笑薄之——此等甘辭蜜語,不能訴吾衷情于一二,卿心明澈,願可鑒之。
論愛侶之屬,愛之尤甚,怨懟尤多,相思酷刑,甚于斧鉞。吾與卿七日未見,此卿卿于吾小懲大誡,吾必銘記於心,定無再犯。昨日歸家途中,見有春梅余香枝頭,衷情難表,癡意難訴,春意兩瓣,托于鴻雁。東君有意,顧惜芳春,卿卿當如東君,顧惜吾心。
最后一张纸只有两行正楷大字:
以上那些我知你必定看不懂,只看這最後兩句罷:我在你樓下等你,一起去閱江樓吃龍蝦。
[USACO]道路与航线
咕了!
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
typedef pair<int,int>pii;
const int N=25000+5,M=50000+5,INF=1e9+7,inf=0x3f3f3f3f;
int n,r,p,s,in[N];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int hd[N],tt=1;
struct edge{int v,w,nxt;}e[M<<2];
void add(int u,int v,int w){
e[++tt]=(edge){v,w,hd[u]},hd[u]=tt;
}
int bl[N],cnt=0;
vector<int>blo[N];
void dfs(int u){
bl[u]=cnt,blo[cnt].push_back(u);
for(int i=hd[u],v;i;i=e[i].nxt)
if(!bl[v=e[i].v]) dfs(v);
}
int dis[N];bool vis[N];
void topsort(){
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int>Q;dis[s]=0;//,Q.push((bl[s]))
for(int i=1;i<=cnt;++i) if(!in[i]) Q.push(i);
priority_queue<pii,vector<pii>,greater<pii> >q;
while(!Q.empty()){
int k=Q.front();Q.pop();
for(int i=0,x;i<blo[k].size();++i) x=blo[k][i],q.push(make_pair(dis[x],x));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=hd[u],v,w;i;i=e[i].nxt){
if(dis[v=e[i].v]>dis[u]+(w=e[i].w)){
dis[v]=dis[u]+w;
if(bl[v]==bl[u]) q.push((make_pair(dis[v],v)));
}
if(bl[u]!=bl[v]&&!(--in[bl[v]])) Q.push(bl[v]);
}
}
}
}
int main(){
freopen("in.txt","r",stdin);
rd(n),rd(r),rd(p),rd(s);
for(int i=1,u,v,w;i<=r;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
for(int i=1;i<=n;++i) if(!bl[i]) ++cnt,dfs(i);
for(int i=1,u,v,w;i<=p;++i)
rd(u),rd(v),rd(w),add(u,v,w),++in[bl[v]];
topsort();
for(int i=1;i<=n;++i)
if(dis[i]>=1e9) puts("NO PATH");
else printf("%d
",dis[i]);
return 0;
}
USACO cow relays
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
#define Abs(x) ((x)<0?-(x):(x))
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
typedef pair<int,int>pii;
const int N=1e6+5,M=200+5,INF=1e9+7,inf=0x3f3f3f3f;
int n,m,s,t,id[N];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
struct mp{
int v[M][M];
mp operator *(const mp &x)const{
mp c;
memset(c.v,inf,sizeof(c.v));
for(int k=1;k<=id[0];++k)
for(int i=1;i<=id[0];++i)
for(int j=1;j<=id[0];++j)
c.v[i][j]=Min(c.v[i][j],v[i][k]+x.v[k][j]);
return c;
};
}a;
int main(){
// freopen("in.txt","r",stdin);
rd(n),rd(m),rd(s),rd(t);
memset(a.v,inf,sizeof(a.v));
for(int i=1,u,v,w;i<=m;++i){
rd(w),rd(u),rd(v);
if(!id[u]) id[u]=++id[0];
if(!id[v]) id[v]=++id[0];
a.v[id[u]][id[v]]=a.v[id[v]][id[u]]=Min(a.v[id[u]][id[v]],w);
}
mp res=a;--n;
while(n){
if(n&1) res=res*a;
a=a*a,n>>=1;
}
printf("%d",res.v[id[s]][id[t]]);
return 0;
}