zoukankan      html  css  js  c++  java
  • 【2019.8.30】Za

    Za 2019.8.30

    SDOI2011 计算器

    [BZOJ2242] [luoguP2485]

    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]道路与航线

    [BZOJ2200] [luoguP3008]

    咕了!

    #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;
    }
    
  • 相关阅读:
    Jeronimo's List Gym
    Jeronimo's List Gym
    Text Editor Gym
    Text Editor Gym
    树上最长距离模板
    树上最长距离模板
    Purple Rain Gym
    数制转化2
    小括号匹配
    数制转化
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11437376.html
Copyright © 2011-2022 走看看