1165D,HDU 6030,HDU - 6030,HDU 2276

107 阅读3分钟

1165D - Almost All Divisors

这题好多坑点,其实也是自己做这个题太莽了没注意到隐含的条件,想一下如果条件符合不是-1的情况下我们只需要输出d[1]*d[n]就可以了,可以试一试随便一个数都是等于第一个因子乘以最后一个的,前提是排好序的情况下;重点其实是判断-1的情况,wa了很多发,需要判断每个d[i]和d[n-i+1]的乘积是不是一样的,另外还需要判断每个d[i]的因子是否出现过,如果d[i]出现了因子却没出现这显然是不符合情况的

ll t,n,d[305],vis[1000006];
ll lcm(ll a,ll b){
    return a*b/__gcd(a,b);
}
bool su(ll x){
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0) return false;
    return true;
}
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&d[i]),vis[d[i]]=1;
        sort(d+1,d+n+1);
        ll flag=1,tm=d[1]*d[n];
        for(int i=1;i<=n;i++){
            for(int j=2;j<=sqrt(d[i]);j++){
                if(d[i]%j==0&&(vis[d[i]/j]==0||vis[j]==0)){flag=0;break;} 
            }
        }
        for(int i=2;i<=(n+1)/2;i++){
            if(d[i]*d[n-i+1]!=tm){flag=0;break;}
        }
        if(flag) printf("%lld\n",d[1]*d[n]);
        else printf("-1\n");
        for(int i=1;i<=n;i++) vis[d[i]]=0;
    }
    system("pause");
    return 0;
}

Happy Necklace - HDU 6030 - Virtual Judge (vjudge.net) 矩阵快速幂

好家伙连一个式子都推不出来,,,

题意也弄错了,,应该是要求任意素数区间段内红色大于蓝色,问有多少种方案。

我们先看2的时候,满足的有rr,br,rb,等于3的时候就要从2的时候转移过来只看后两位,rr可以变为rb,rr;br可以变为rr,rb不可以因为这样r就小于b了;rb可以变为br。可以看出rr可以有上一次的rr和br转移过来,br可以有上一次的rb转移过来,rb可以有上一次的rr转移过来,设a[i],b[i],c[i]为n=i时rr,br,rb的个数,则有a[i]=a[i-1]+b[i-1],b[i]=c[i-1],c[i]=a[i-1],而题目要求的是s[i]=a[i]+b[i]+c[i],所以

s[i]=a[i]+b[i]+c[i]=2a[i-1]+b[i-1]+c[i-1]

s[i-1]=2a[i-2]+b[i-2]+c[i-2]

s[i-2]=2a[i-3]+b[i-3]+c[i-3]

s[i-3]=2a[i-3]+b[i-3]+c[i-3]

s[i]=2a[i-1]+b[i-1]+c[i-1]=3a[i-2]+2b[i-2]+c[i-2]

     =s[i-1]+a[i-2]+b[i-2]

     =s[i-1]+a[i-3]+b[i-3]+c[i-3]

     =s[i-1]+s[i-3];

递推式就推出来了,转移矩阵也就好写了,注意要从4开始因为n>=2所以最小的s[n-1]是s[4],另外最后乘起来的时候B矩阵的第一行所有的数都要参与乘法,即

res.mat[0][0]*6LL%mod+res.mat[0][1]*4LL%mod+res.mat[0][2]*3LL%mod

 HDU - 6030 - Happy Necklace - (矩阵快速幂 )_菜圾的博客-CSDN博客

struct matrix{
    ll row,col;
    ll mat[4][4];
    matrix(){
        memset(mat,0,sizeof(mat));
    }
    void init(){
        *this=matrix();
        row=col=3;
        for(int i=0;i<3;i++) mat[i][i]=1;
    }
    matrix operator*(const matrix& a)const{
        matrix res=matrix();res.row=row;res.col=col;
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        for(int k=0;k<col;k++)
        res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
        return res;
    }
    matrix matpow(ll b){
        matrix res = matrix();
        res.init();
        matrix base=*this;
        while(b){
            if(b&1) res=res*base;
            base=base*base;
            b>>=1;
        }
        return res;
    }
};
int main(){
    ll t,n;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        if(n==2) printf("3\n");
        else if(n==3) printf("4\n");
        else if(n==4) printf("6\n");
        else{
            matrix b=matrix();
            b.row=b.col=3;
            b.mat[0][0]=b.mat[0][2]=b.mat[1][0]=b.mat[2][1]=1;
            matrix res=b.matpow(n-4LL);
            //cout<<res.mat[0][0]<<" "<<res.mat[0][2]<<endl;
            printf("%lld\n",(res.mat[0][0]*6LL%mod+res.mat[0][1]*4LL%mod+res.mat[0][2]*3LL%mod)%mod);
        }
    }
    system("pause");
    return 0;
}

Kiki & Little Kiki 2 - HDU 2276 - 矩阵快速幂

f[n][l]表示在第n秒,第l个字符的状态,则f[n][l]有两种情况

f[n][l]=f[n-1][l]     //f[n-1][l-1]==0
f[n][l]=1-f[n-1][l]   //f[n-1][l-1]==1

进而发现可以转化成一种情况:f[n][l]=(f[n-1]l]+f[n-1][l-1])%2

然后就可以造出转移矩阵

\begin{bmatrix} f[n][1]\ f[n][2]\ ...\ f[n][l] \end{bmatrix}=\begin{bmatrix} 1 & 0 &... & 0 & 1\ 1& 1 &... & 0 & 0\ & & ... & & \ 0& 0 &... & 1 & 1 \end{bmatrix}*\begin{bmatrix} f[n-1][1]\ f[n-1][2]\ ...\ f[n-1][l] \end{bmatrix}

题目挺好的,玛德自己写的不知道为啥就是一直T,换了种题解的写法感觉并没有啥不同并且他还有memset,只是把求快速幂的函数从结构体中拿出来了,然后就能过,我他妈我的就不过,我的构造矩阵还不是n方,是n,玛德不让我过,这他妈的卡的那么严实吗,我浪费了得快一个小时,为了这个TLE,丫的毫无意义

int t,m;
char s[110];
int main(){
    while(~scanf("%d",&m)){
    
    scanf("%s",&s);
    t=strlen(s);mod=2;
    matrix base;
    for(int i=0;i<t;i++)
            for(int j=0;j<t;j++)
            base.mat[i][j]=0;
        base.mat[0][0]=1;
        base.mat[0][t-1]=1;
        for(int i=1;i<t;i++)
            for(int j=1;j<t;j++)
        {
            if(i==j)
            {
                base.mat[i][j]=1;
                base.mat[i][j-1]=1;
            }
        }
    
     matrix res=pow_mod(base,m);
    for(int i=0;i<t;i++){
        int sum=0;
        for(int j=0;j<t;j++)
            {
                sum=(sum+res.mat[i][j]*(s[j]-'0'))%mod;
            }
        printf("%d",sum);
    }
    printf("\n");
    }
    system("pause");
    return 0;
}