首页 > 其他分享 >20240803题解

20240803题解

时间:2024-08-03 16:50:44浏览次数:9  
标签:le int 题解 times 20240803 inline mod

话说T3都把式子推出来了结果忘记差分约束怎么写了。

光线(light)

题面:有\(n\)个玻璃板,第\(i\)个玻璃板的透光率为\(a_i\%\),反射率为\(b_i\%\),有大小为\(1\)个单位的一束光从第\(1\)个玻璃板开始,有多少光能穿透\(n\)层玻璃板。
题解:考虑\(n=2\)时,可以简单算出两个玻璃板组合后的反射率和透光率。将\(n\)个玻璃板依次组合起来,就可以算出整体的透光率。
复杂度\(\Theta(n\log p)\)
代码:

#include<cstdio>
#define int long long
const int N=500005,mod=1000000007;
int n,i100,a[N],b[N],ans=1;
inline int mul(int x,int y){return x*y%mod;}
inline void Mul(int&x,int y){x=mul(x,y);}
inline int pow(int x,int y){
    int res=1;
    for(;y;Mul(x,x),y>>=1)if(y&1)Mul(res,x);
    return res;
}
inline int inv(int x){return pow(x,mod-2);}
inline int div(int x,int y){return mul(x,inv(y));}
inline void Sub(int&x,int y){if((x-=y)<0)x+=mod;}
inline int sub(int x,int y){return Sub(x,y),x;}
inline void Add(int&x,int y){if((x+=y)>=mod)x-=mod;}
inline int add(int x,int y){return Add(x,y),x;}
signed main(){
    freopen("light.in","r",stdin),freopen("light.out","w",stdout),scanf("%lld",&n),i100=inv(100);
    for(int i=1;i<=n;i++)scanf("%lld%lld",a+i,b+i),Mul(a[i],i100),Mul(b[i],i100);
    for(int i=1;i<=n;i++){
        if(i^1)Add(b[i],div(mul(pow(a[i],2),b[i-1]),sub(1,mul(b[i-1],b[i]))));
        if(i^n)Mul(ans,div(a[i],sub(1,mul(b[i],b[i+1]))));
        else Mul(ans,a[i]);
    }
    return printf("%lld\n",ans),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

逼死强迫症(mad)

题面:有\(2\times n\)的网格,两个\(1\times 1\)的矩形和无限个\(2\times 1\)的矩形,要填满所有网格,且两个\(1\times 1\)的矩形不能相邻,求方案数。
题解:定义\(f(i,0)表示\)前\(i-1\)列填满,用了\(0\)个\(1\times 1\)的矩形,第\(i\)列填了\(0\)个的方案数。
\(f(i,1)表示\)前\(i-1\)列填满,用了\(2\)个\(1\times 1\)的矩形,第\(i\)列填了\(0\)个的方案数。
\(f(i,0)表示\)前\(i-1\)列填满,用了\(1\)个\(1\times 1\)的矩形,第\(i\)列填了\(1\)个的方案数。
状态转移方程
\(f(i,0)=f(i-1,0)+f(i-2,0)\)
\(f(i,1)=f(i-1,1)+f(i-2,1)+f(i-1,2)-f(i-1,0)\)
\(f(i,2)=2(f(i-1,0)+f(i-2,0))+f(i-1,2)\)
最后答案为\(f(n+1,2)-nf(n+1,0)\)
矩阵快速幂优化即可。
令矩阵大小\(a=5\),时间复杂度\(\Theta(a^3T\log n)\)
代码:

#include<cstdio>
#include<cstring>
#define int long long
const int mod=1000000007;
int T,n,f[5],a[5][5],g[5],b[5][5],m;
inline int mul(int x,int y){return x*y%mod;}
inline void Add(int&x,int y){if((x+=y)>=mod)x-=mod;}
inline void Sub(int&x,int y){if((x-=y)<0)x+=mod;}
inline int sub(int x,int y){return Sub(x,y),x;}
signed main(){
    for(freopen("mad.in","r",stdin),freopen("mad.out","w",stdout),scanf("%lld",&T);T--;){
        scanf("%lld",&n),f[0]=1,f[1]=1,f[2]=4,f[3]=1,f[4]=0,a[0][0]=1,a[0][1]=0,a[0][2]=0,a[0][3]=1,a[0][4]=0,a[1][0]=-1,a[1][1]=1,a[1][2]=1,a[1][3]=0,a[1][4]=1,a[2][0]=2,a[2][1]=0,a[2][2]=1,a[2][3]=2,a[2][4]=0,a[3][0]=1,a[3][1]=0,a[3][2]=0,a[3][3]=0,a[3][4]=0,a[4][0]=0,a[4][1]=1,a[4][2]=0,a[4][3]=0,a[4][4]=0,m=n-1;
        for(;m;m>>=1){
            if(m&1){
                memset(g,0,sizeof(g));
                for(int i=0;i<5;i++)for(int j=0;j<5;j++)Add(g[i],mul(a[i][j],f[j]));
                memcpy(f,g,sizeof(g));
            }
            memset(b,0,sizeof(b));
            for(int i=0;i<5;i++)for(int k=0;k<5;k++)for(int j=0;j<5;j++)Add(b[i][j],mul(a[i][k],a[k][j]));
            memcpy(a,b,sizeof(b));
        }
        printf("%lld\n",sub(f[1],mul(f[0],n)));
    }
    return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

节日(fes)

题面:有\(n\)个数\(a_1\dots a_n\),\(m_1\)个限制关系1,\(m_2\)个限制关系2,限制关系1唯一个二元有序对\((i,j)\)表示\(a_i=a_j+1\),限制关系2唯一个二元有序对\((i,j)\)表示\(a_i\ge a_j\),求\(a\)在去重后有多少个数。
题解:差分约束,对于限制关系1建立\((i,j)\)边权为\(-1\)的边和\((j,i)\)边权为\(1\)的边。
对于限制关系2建立\((j,i)\)的边。
对于图中的一个强连通分量表示一个明确的限制关系,可以出现的数的种类为最长路\(+1\)。
先用tarjan算法求出强联通分量,再在每个强联通分量内部用floyd算法求出最长路即可。
代码:懒得写

子序列(subsequence)

题面:长度为\(n\)的序列\(a\),可以选择一个长度为\(k(1\le k\le n)\)的序列\(id\),使得\(a_{id_j}\leftarrow \sum_{1\le k\le j}a_{id_k}\),问进行一次操作后,\(a\)有多少种不同的情况。
题解:只有在前缀和为\(0\)时,情况才会重复。
令\(f(i,j)\)表示将\(a_i\leftarrow a_i+j\)时的方法数。
若\(a_i+j\neq 0\),那么将\(i+1\le k\le n\)进行更新。
\(f(i,j)\stackrel\sum{\longrightarrow}f(k,a_i+j)\)
若\(a_i+j=0\),那么将\(i+1\le k\le n\)进行更新时,\(a_k\leftarrow a_k+v\),\(v\in\{a_x|i+1\le x\le k-1\}\)
\(f(i,j)\stackrel\sum{\longrightarrow}f(k,v)\)
时间复杂度\(\Theta(n^3\log n|A|)\),A为值域。
代码:

#include<cstdio>
#include<set>
const int N=105,mod=1000000007;
int n,a[N],d[N][2010],*f[N],ans=1;
std::set<int>s;
inline void Add(int&x,int y){(x+=y)>=mod&&(x-=mod);}
int main(){
    freopen("subsequence.in","r",stdin),freopen("subsequence.out","w",stdout),scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",a+i);
    for(int i=0;i<=n;i++)f[i]=d[i]+1005;
    f[0][0]=1;
    for(int i=0;i<n;i++)for(int j=-1000;j<=1000;j++){
        if(!f[i][j])continue;
        s.clear();
        if(a[i]+j)s.insert(a[i]+j);
        for(int k=i+1;k<=n;k++){
            for(int x:s)Add(f[k][x],f[i][j]);
            if(a[i]+j==0&&a[k])s.insert(a[k]);
        }
    }
    for(int i=1;i<=n;i++)for(int j=-1000;j<=1000;j++)Add(ans,f[i][j]);
    return printf("%d\n",ans),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

标签:le,int,题解,times,20240803,inline,mod
From: https://www.cnblogs.com/junjunccc/p/18340756

相关文章

  • 第三次测试题解
    问题F:求多个数的最大公约数multigcd[1*]:`#includeincludeincludeincludeusingnamespacestd;intfun(inta,intb){returnb==0?a:fun(b,a%b);}intmain(){intn;cin>>n;vectora(n+1,0);for(inti=1;i<=n;i++)scanf("%d",&a[i]);intans......
  • 镜面质数 题解
    题目id:20313题目描述如果一个质数镜像反转(即将该数各个位上数字反转)后仍然是质数,那么就称这个质数为镜像质数。例如质数\(13\)反转后为\(31\),则\(13\)为一个镜像质数。现在给定一个整数\(N\),请求出整数\(1\simN\)范围内有几个镜像质数。注意:求范围内的镜像质数时,质数和镜像反......
  • CF1946F Nobody is needed 题解
    Nobodyisneeded推销我的洛谷博客。题意多组数据。给定一个长度为\(n\)的排列\(a\),你需要回答\(q\)组询问,每组询问给出\(l,r\),求有多少个子序列\(t\)使得:\(l\leqslantt_1<t_2<\cdots<t_k\leqslantr\)。\(a_{t_i}|a_{t_{i+1}}(1\leqslanti<k)\)......
  • NSSCTF Web 题解 Write up
    NSSCTFWeb题解Writeup一、Do_you_know_http1、开题2、分析页面显示请使用“WLLM”浏览器,我没听说过“WLLM”浏览器,那首先去User-Agent修改访问的浏览器。用HackBar分析,将UA的值改成WLLM。用EXECUTE请求页面显示你只可以在本地正常阅读,并给出了ip。那简单,还是用HackB......
  • docker安装zabbix 20240803
    宿主机IP:192.168.177.1281、下载数据库:dockerpullmysql:5.7 2、下载支持数据库的zabbix:dockerpullzabbix/zabbix-server-mysql:centos-latest 3、下载web容器:dockerpullzabbix/zabbix-web-nginx-mysql:latest  4、下载java监控:dockerpullzabbix/z......
  • AGC013B 题解
    注意到只要随便dfs,如果没有可以走的点,说明这个端点满足要求。因为有两个端点,所以从同一个点开始搜两次,拼在一起就行了。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+5;vector<int>e[N];intn,m;boolvis[N];voiddfs(in......
  • AGC009B 题解
    注意到如果把每一对胜者败者连边,可以得到一颗树:(例子)但是因为胜者每次只能和一个败者打,所以要用类似多叉转二叉的方法,让有不止一个孩子的节点变成有一个孩子和一个虚点。如图,原来\(1\)有三个儿子\(2,3,4\),通过转换,变成了上图。上图可以直接变成对战图(\(x2\tox1\to1)\):(原......
  • AGC049A 题解
    弱化版:CF280CGameonTree(有向图的限制变成一棵根节点为1的外向树)弱化版解法:根据期望线性性,\(Ans=\sum_{i=1}^nE(p_i)\)。其中\(p_i\)是\(i\)被选到的概率。因为对于\(i\)和\(i\)的祖先节点,某个点在这些店里是第一个备选的概率相同。所以\(p_i=\dfrac{1}{dep_i}\)......
  • joisc2017 D3T1 长途巴士 题解
    joisc2017D3T1长途巴士题解这是学校ACM欢乐赛的题,赛时想到做法了,但是因为我各种唐诗没写出来翻了转化题面我们发现,只可以踢掉检查站前面一个连续段的接水人,并且不能踢掉司机,考虑画出对整个路程表示的线段上图几个小点是检查点,考虑在每个检查点之前踢掉一段的人,容易发......
  • ABC269F 题解
    注意到第\(i\)行和第\(i+2\)行被删除的格子的排列顺序相同,格子上的数差了\(2m\)。于是处理出第\(i,i+1\)行的答案\(a_i,a_{i+1}\),有值的格子的个数\(c_i,c_{i+1}\)。令\(s(i)=\dfrac{(i-1)i}2\),也就是\(\sum_{j=1}^{i-1}j\)。第\(i,i+2,i+4\cdots\)行的和:\(a_i\t......