破解D-H协议

列个式子会发现是BSGSBSGSBSGS的模板题,直接码就是了。

代码:

#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
typedef long long ll;
inline int ksm(int a,int p,int mod){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
int g,p,sqr,inv;
tr1::unordered_map<int,int>S;
inline void init(int a,int mod){
    sqr=ceil(sqrt(mod)),inv=ksm(a,mod-2,mod),a=ksm(a,sqr,mod);
    for(ri i=0,mul=1;i<=mod/sqr;++i,mul=(ll)mul*a%mod)S[mul]=i?i:sqr;
}
inline int query(int b,int mod){for(ri i=0,mul=b;i<sqr;++i,mul=(ll)mul*inv%mod)if(S[mul])return (S[mul])%sqr*sqr+i;}
int main(){
    int n,g,p;
    g=read(),p=read(),init(g,p);
    for(ri tt=read(),a,b;tt;--tt){
        a=query(read()%p,p),b=query(read()%p,p);
        cout<<ksm(ksm(g,a,p),b,p)<<'\n';
    }
    return 0;
}

社交网络

按照题意模拟写有向图的矩阵树就完了。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int mod=10007,N=255;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,m,a[N][N];
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return a*b%mod;}
inline int gauss(){
    int ret=1;
    for(ri i=2;i<=n;++i){
        for(ri j=i+1;j<=n;++j){
            while(a[j][i]){
                int tmp=a[i][i]/a[j][i];
                for(ri k=i;k<=n;++k)a[i][k]=dec(a[i][k],mul(tmp,a[j][k]));
                for(ri k=i;k<=n;++k)swap(a[i][k],a[j][k]);
                ret=mod-ret;
            }
        }
        ret=mul(ret,a[i][i]);
    }
    return ret;
}
int main(){
    n=read(),m=read();
    for(ri i=1,u,v;i<=m;++i)u=read(),v=read(),--a[u][v],++a[u][u];
    for(ri i=1;i<=n;++i)for(ri j=1;j<=n;++j)if(a[i][j]<0)a[i][j]+=mod;
    cout<<gauss();
    return 0;
}

交错序列

二项式展开一下xayb=(n−y)ayb=∑i=0aCaini(−1)a−iya+b−ix^ay^b=(n-y)^ay^b=\sum_{i=0}^aC_a^in^i(-1)^{a-i}y^{a+b-i}xayb=(n−y)ayb=∑i=0a​Cai​ni(−1)a−iya+b−i

然后用矩阵快速幂优化dpdpdp转移出yyy每个幂的个数即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1e7+5,M=185;
int mod,lim,n,a,b,ans=0,C[M][M],m;
typedef long long ll;
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
struct Mat{
    int a[M][M];
    inline int*operator[](const int&k){return a[k];}
    Mat(int x=0){for(ri i=0;i<lim;++i)for(ri j=0;j<lim;++j)a[i][j]=i==j?x:0;}
    friend inline Mat operator*(Mat A,Mat B){
        Mat ret(0);
        for(ri i=0;i<lim;++i)for(ri k=0;k<lim;++k)if(A[i][k])
        for(ri j=0;j<lim;++j)if(B[k][j])ret[i][j]=add(ret[i][j],mul(A[i][k],B[k][j]));
        return ret;
    }
    friend inline Mat operator^(Mat A,int p){
        Mat ret(1);
        for(;p;p>>=1,A=A*A)if(p&1)ret=ret*A;
        return ret;
    }
}S;
int main(){
    scanf("%d%d%d%d",&n,&a,&b,&mod);
    lim=(m=a+b+1)<<1;
    C[0][0]=1;
    for(ri i=1;i<=a+b;++i){
        C[i][0]=1;
        for(ri j=1;j<=i;++j)C[i][j]=add(C[i-1][j],C[i-1][j-1]);
    }
    for(ri i=0;i<m;++i){
        S[i][i]=S[i][i+m]=1;
        for(ri j=0;j<=i;++j)S[i+m][j]=C[i][j];
    }
    S=S^n;
    for(ri i=0,mult=1;i<=a;++i){
        if((a-i)&1)ans=dec(ans,mul(mul(C[a][i],mult),add(S[a+b-i][0],S[a+b-i+m][0])));
        else ans=add(ans,mul(mul(C[a][i],mult),add(S[a+b-i][0],S[a+b-i+m][0])));
        mult=mul(mult,n);
    }
    cout<<ans;
    return 0;
}

解锁屏幕

状压dpdpdp水题。

fstat,if_{stat,i}fstat,i​表示解锁状态为statstatstat,最后一个解锁的是iii的方案数,枚举下一个解锁点转移即可,注意预处理不可行的状态。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    bool f=1;
    char ch=getchar();
    while(!isdigit(ch))f^=ch=='-',ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return f?ans:-ans;
}
typedef long long ll;
const int N=20,mod=100000007;
int n,f[1<<N][N],ban[N][N],cnt[1<<N],ans=0,id[1<<N];
struct pot{
    int x,y;
    pot(int _x=0,int _y=0):x(_x),y(_y){}
    friend inline pot operator+(const pot&a,const pot&b){return pot(a.x+b.x,a.y+b.y);}
    friend inline pot operator-(const pot&a,const pot&b){return pot(a.x-b.x,a.y-b.y);}
    friend inline int operator^(const pot&a,const pot&b){return a.x*b.y-a.y*b.x;}
}a[N];
inline int lowbit(const int&x){return x&-x;}
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
inline void update(int&a,const int&b){a=add(a,b);}
inline bool check(int i,int j,int k){
    pot x=a[i],y=a[j],z=a[k];
    return z.x>=min(x.x,y.x)&&z.x<=max(x.x,y.x)&&z.y>=min(x.y,y.y)&&z.y<=max(x.y,y.y)&&((z-x)^(z-y))==0;
}
int main(){
    n=read();
    for(ri i=0;i<n;++i)a[i].x=read(),a[i].y=read();
    for(ri i=0;i<n;++i)for(ri j=0;j<n;++j)if(i^j)for(ri k=0;k<n;++k)
    if(k!=i&&k!=j)if(check(i,j,k))ban[i][j]|=1<<k;
    for(ri i=0;i<n;++i)f[1<<i][i]=1;
    for(ri i=0,up=1<<n;i<up;++i)cnt[i]=cnt[i>>1]+(i&1);
    for(ri i=0;i<n;++i)id[1<<i]=i;
    for(ri i=0,up=(1<<n)-1;i<=up;++i){
        if(!i)continue;
        for(ri all=i,j=lowbit(all);all;all^=j,j=lowbit(all)){
            if(f[i][id[j]])for(ri det=up^i,k=lowbit(det);det;det^=k,k=lowbit(det)){
                if((ban[id[j]][id[k]]&i)^ban[id[j]][id[k]])continue;
                update(f[i^k][id[k]],f[i][id[j]]);
            }
        }
    }
    for(ri i=0;i<(1<<n);++i)if(cnt[i]>3)
    for(ri all=i,j=lowbit(all);all;all^=j,j=lowbit(all))update(ans,f[i][id[j]]);
    cout<<ans;
    return 0;
}

九连环

首先手玩几分钟小数据来推一个结论:

fn=fn−1+2fn−2+1f_n=f_{n-1}+2f_{n-2}+1fn​=fn−1​+2fn−2​+1

然后可以构造两个等式:

  1. (fn+fn−1+1)=2(fn−1+fn−2+1)(f_n+f_{n-1}+1)=2(f_{n-1}+f_{n-2}+1)(fn​+fn−1​+1)=2(fn−1​+fn−2​+1)
  2. (fn−2fn−1−12)=−(fn−1−fn−12)(f_n-2f_{n-1}-\frac12)=-(f_{n-1}-f_n-\frac12)(fn​−2fn−1​−21​)=−(fn−1​−fn​−21​)

然后变形一波可以得到fn=⌊2n+1−13⌋f_n=\left\lfloor\frac{2^{n+1}-1}3\right\rfloorfn​=⌊32n+1−1​⌋

然后用fftfftfft优化高精+快速幂即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long double ldb;
struct Cp{
    ldb x,y;
    friend inline Cp operator+(const Cp&a,const Cp&b){return (Cp){a.x+b.x,a.y+b.y};}
    friend inline Cp operator-(const Cp&a,const Cp&b){return (Cp){a.x-b.x,a.y-b.y};}
    friend inline Cp operator*(const Cp&a,const Cp&b){return (Cp){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
    friend inline Cp operator*(const Cp&a,const ldb&b){return (Cp){a.x*b,a.y*b};}
    friend inline Cp operator/(const Cp&a,const ldb&b){return (Cp){a.x/b,a.y/b};}
};
const ldb pi=acos(-1.0);
int lim,tim;
vector<Cp>A,B;
vector<int>pos;
inline void init(const int&up){
    lim=1,tim=0;
    while(lim<=up)lim<<=1,++tim;
    pos.resize(lim),A.resize(lim),B.resize(lim),pos[0]=0;
    for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
inline void fft(vector<Cp>&a,const int&type){
    for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
    for(ri mid=1;mid<lim;mid<<=1){
        Cp wn=(Cp){cos(pi/mid),type*sin(pi/mid)};
        for(ri j=0,len=mid<<1;j<lim;j+=len){
            Cp w=(Cp){1,0},a0,a1;
            for(ri k=0;k<mid;++k,w=w*wn){
                a0=a[j+k],a1=a[j+k+mid]*w;
                a[j+k]=a0+a1,a[j+k+mid]=a0-a1;
            }
        }
    }
    if(type==-1)for(ri i=0;i<lim;++i)a[i]=a[i]/(ldb)lim;
}
struct poly{
    vector<Cp>a;
    poly(int k=0,Cp x=(Cp){0,0}){a.resize(k+1),a[k]=x;}
    inline int deg()const{return a.size()-1;}
    inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k+1),ret;}
    inline Cp&operator[](const int&k){return a[k];}
    inline const Cp&operator[](const int&k)const{return a[k];}
    friend inline poly operator*(const poly&a,const poly&b){
        int n=a.deg(),m=b.deg();
        init(n+m);
        poly ret(lim);
        for(ri i=0;i<=n;++i)A[i]=a[i];
        for(ri i=0;i<=m;++i)B[i]=b[i];
        for(ri i=n+1;i<lim;++i)A[i]=(Cp){0,0};
        for(ri i=m+1;i<lim;++i)B[i]=(Cp){0,0};
        fft(A,1),fft(B,1);
        for(ri i=0;i<lim;++i)A[i]=A[i]*B[i];
        return fft(A,-1),ret.a=A,ret;
    }
    friend inline poly operator*(const poly&a,const ldb&b){
        poly ret(a.deg());
        for(ri i=0;i<=a.deg();++i)ret[i]=a[i]*b;
        return ret;
    }
    friend inline poly operator/(const poly&a,const ldb&b){
        poly ret(a.deg());
        for(ri i=0;i<=a.deg();++i)ret[i]=a[i]/b;
        return ret;
    }
};
inline poly update(const poly&a){
    vector<int>res;
    int sum=0;
    for(ri val,i=0,up=a.deg();i<=up;++i)val=((int)(a[i].x+0.5))+sum,sum=val/10,res.push_back(val%10);
    while(sum)res.push_back(sum%10),sum/=10;
    while(!res[res.size()-1]&&res.size()!=1)res.pop_back();
    poly ret(res.size()-1);
    for(ri i=0;i<=ret.deg();++i)ret[i]=(Cp){res[i],0};
    return ret;
}
inline void ksm(int p){
    poly ret,a;
    ret[0]=(Cp){1,0},a[0]=(Cp){2,0};
    while(p){
        a=update(a);
        if(p&1)ret=update(ret),ret=ret*a;
        a=a*a,p>>=1;
    }
    ret=update(ret),reverse(ret.a.begin(),ret.a.end());
    vector<int>ans;
    for(ri val,divv=0,i=0;i<=ret.deg();++i)val=(int)ret[i].x+divv,ans.push_back(val/3),divv=val%3*10;
    int pos=0;
    while(!ans[pos]&&pos!=ans.size()-1)++pos;
    for(ri i=pos;i<ans.size();++i)cout<<ans[i];
    puts("");
}
char s[10005];
int main(){
    int n,m;
    scanf("%d",&m);
    while(m--)scanf("%d",&n),ksm(n+1);
    return 0;
}

异或序列

简单的异或前缀和处理+莫队统计答案。

代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int sum[N],block,n,m,k,cnt[N],dl=0,dr=-1,ans[N],tmp=0;
struct Q{int l,r,id,blo;}q[N];
inline bool cmp(Q a,Q b){return a.blo==b.blo?a.r<b.r:a.blo<b.blo;}
int main(){
	n=read(),m=read(),k=read(),block=sqrt(n);
	for(int i=1;i<=n;++i)sum[i]=read()^sum[i-1];
	for(int i=1;i<=m;++i)q[i].id=i,q[i].l=read()-1,q[i].r=read(),q[i].blo=(q[i].l-1)/block+1;
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;++i){
		if(q[i].r<dl||q[i].l>dr){
			for(int j=dl;j<=dr;++j)--cnt[sum[j]];
			tmp=0,dl=q[i].l,dr=q[i].r;
			for(int j=dl;j<=dr;++j)tmp+=cnt[k^sum[j]],++cnt[sum[j]];
		}
		else{
			while(dl<q[i].l)--cnt[sum[dl]],tmp-=cnt[k^sum[dl++]];
			while(dl>q[i].l)tmp+=cnt[k^sum[--dl]],++cnt[sum[dl]];
			while(dr<q[i].r)tmp+=cnt[k^sum[++dr]],++cnt[sum[dr]];
			while(dr>q[i].r)--cnt[sum[dr]],tmp-=cnt[k^sum[dr--]];
		}
		ans[q[i].id]=tmp;
	}
	for(int i=1;i<=m;++i)printf("%d\n",ans[i]);
	return 0;
}

CQOI2018 简要题解的更多相关文章

  1. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  2. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  3. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  4. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  5. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  6. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

  7. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. Android Studio计时跳转或点击跳转至主页面

    这个总体来说是比较简单的,计时跳转一般调用Android Studio中的Handler方法. 一.发生点击事件跳转页面 mBtnTextView = (Button) findViewById(R. ...

  2. You Only Look Once: Unified, Real-Time Object Detection

    论文下载:http://arxiv.org/abs/1506.02640  代码下载:https://github.com/pjreddie/darknet Abstract 作者提出一种新的目标检测 ...

  3. PyCharm下的pywin32安装及使用

    转载http://www.mamicode.com/info-detail-2145088.html

  4. zookeeper 集群部署

    参考: https://www.cnblogs.com/linuxprobe/p/5851699.html

  5. leetcode42

    class Solution: def calLeft(self,height,rightval,left,right): if left>=right: return 0 sums = 0 m ...

  6. UI5-培训篇-Fiori培训

    1.学习网站: SAPUI5学习地址: https://blog.csdn.net/stone0823/article/category/6650292/1? SAPUI5文档: https://sa ...

  7. Kettle安装Kafka Consumer和Kafka Producer插件

    1.从github上下载kettle的kafka插件,地址如下 Kafka Consumer地址: https://github.com/RuckusWirelessIL/pentaho-kafka- ...

  8. Java6及以上版本对synchronized的优化

    目录 1.概述 2.实现同步的基础 3.实现方式 4.Java对象头(存储锁类型) 5.优化后synchronized锁的分类 6.锁的升级(进化) 6-1.偏向锁 6-2.轻量级锁 6-3.锁的比较 ...

  9. pynlpir 报错 Cannot Save user dictionary 原因与解决方法

    在使用pynlpir和用户自定义词典进行分词时,如果报出如下错误: [2017-12-09 18:05:51] Cannot Save user dictionary Cannot write log ...

  10. js鼠标相关事件