【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\n",(ll)qpow(y,p-2)*z%p);
}
void work3(){
    int ans=BSGS();
    if(ans==-1) puts("Orz, I cannot find x!");
    else printf("%d\n",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\n",(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^x\equiv 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\n",Abs(d[x]-d[y])-1);
        }
    }
    return 0;
}

卿卿吾愛,見字如晤:
  體無恙否?心安樂否?藝人之工作順利否?
  屈指算來,吾與汝七日未見,人言一日不見,如隔三秋,七日之長,煎熬甚苦。人生苦短如斯,言語小恚,便有這許多煎熬,若他日真作計較,又當何以自處?思來想去,日夜翻覆,更覺會日何短,隔日何長?憂思何繁,歡顏何驟?
  吾心愛汝,願見歡顏,恨吾怨吾,皆吾自取。當日失言,悔之不及。前日電訊致歉,卿定有閱之,閱而不復,非卿之過,是吾書未達意,辭未達情。游目天地,何以悅卿?雖天涯海角,卿所樂之,吾必往之,幽王癡情,敢笑薄之——此等甘辭蜜語,不能訴吾衷情于一二,卿心明澈,願可鑒之。
  論愛侶之屬,愛之尤甚,怨懟尤多,相思酷刑,甚于斧鉞。吾與卿七日未見,此卿卿于吾小懲大誡,吾必銘記於心,定無再犯。昨日歸家途中,見有春梅余香枝頭,衷情難表,癡意難訴,春意兩瓣,托于鴻雁。東君有意,顧惜芳春,卿卿當如東君,顧惜吾心。
  最后一张纸只有两行正楷大字:
  以上那些我知你必定看不懂,只看這最後兩句罷:我在你樓下等你,一起去閱江樓吃龍蝦。

[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\n",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;
}

猜你喜欢

转载自www.cnblogs.com/lxyyyy/p/11437376.html
za