题解:广义斐波那契数列 矩阵乘法

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std; LL n,A,B; inline LL read(){
char ch=getchar();LL x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} struct maxtix{
int t[][];
}ans; maxtix maxtix_mul(maxtix a,maxtix b){
maxtix tmp;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
tmp.t[i][j]=;
for(int k=;k<=;k++){
tmp.t[i][j]=(tmp.t[i][j]%+a.t[i][k]*b.t[k][j]%)%;
}
}
}
return tmp;
} maxtix maxtix_mul(maxtix a,LL b){
maxtix ret=a;b--;
while(b){
if(b&)ret=maxtix_mul(ret,a);
a=maxtix_mul(a,a);
b>>=;
}
return ret;
} int main(){
freopen("attack.in","r",stdin);
freopen("attack.out","w",stdout);
A=read();B=read();n=read();
A%=;B%=;
if(n<=){
LL f1=,f2=,f3;
for(int i=;i<=n;i++){
f3=(A*f2+B*f1)%;
f1=f2;f2=f3;
}
printf("%lld\n",f2);
fclose(stdin);fclose(stdout);
return ;
}
ans.t[][]=;ans.t[][]=B;ans.t[][]=;ans.t[][]=A;
ans=maxtix_mul(ans,n-);
printf("%d\n",(ans.t[][]+ans.t[][])%);
fclose(stdin);fclose(stdout);
return ;
}

AC

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set> #define rg register
inline void read (int &n)
{
rg char c = getchar ();
for (n = ; !isdigit (c); c = getchar ());
for (; isdigit (c); n = n * + c - '', c = getchar ());
} #define Max 20006
int a[Max], s[Max];
std :: string data;
std :: set <std :: string> lis; int main (int argc, char *argv[])
{
// freopen ("tb.txt", "w", stdout);
int T, x, y, N, C, r ; rg int i;
for (x = ; x <= ; ++ x)
{
for (y = ; y <= x; ++ y)
{
N = x + y;
data.resize (N); C = , r = ;
printf ("%d %d ", x, y);
if (y == ) { puts ("1.000000"); continue; }
if (x == ) { puts ("0.000000"); continue; } if (y > x) { puts ("0.000000"); continue; }
for (i = ; i <= x; ++ i) a[i] = ;
for (i = x + ; i <= N; ++ i) a[i] = ;
do
{
// for (i = 0; i < N; ++ i) data[i] = a[i + 1] - '0';
// if (lis.count (data)) continue;
// else lis.insert (data); s[N + 1] = 0;
for (i = N; i >= ; -- i)
{
s[i] = s[i + ] + a[i];
if (s[i] > (N - i + ) - s[i]) { ++ r; break; }
}
++ C;
} while (std :: next_permutation (a + , a + + N));
printf ("%.6lf\n", (C - r) * 1.0 / C);
// puts ("");
}
}
return ;
}

ZlycerQan打表code

打表找规律 n相同m不同时是等差数列。

注意特判

#include<iostream>
#include<cstdio>
using namespace std; int t,n,m; int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n<m){puts("0.000000");continue;}
printf("%.6lf\n",1.0-m/(n+1.0));
}
}

AC

 题解:

暴力40

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define N 20009
using namespace std;
queue<int>q;
int n,m,sumedge; int head[N]; int sum_col,tim,top; int instack[N],Stack[N],bel[N],low[N],dfn[N],ans[N]; int sumEDge,hed[N],d[N],vis[N],dis[N],cnt[N],po[N]; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[(N*)<<]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} struct EDge{
int x,y,z,nxt;
EDge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}e[N<<]; void add_(int x,int y,int z){
e[++sumEDge]=EDge(x,y,z,hed[x]);
hed[x]=sumEDge;
} inline int read(){
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} void tarjian(int x,int fa){
low[x]=dfn[x]=++tim;
instack[x]=true;Stack[++top]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
// if(v==fa)continue;
if(instack[v]&&v!=fa){
low[x]=min(low[x],dfn[v]);
}else if(dfn[v]==){
tarjian(v,x);
low[x]=min(low[x],low[v]);
}
}
if(low[x]==dfn[x]){
sum_col++;
while(Stack[top+]!=x){
bel[Stack[top]]=sum_col;
instack[Stack[top]]=false;
top--;
}
}
} void spfa(int s){
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
while(!q.empty())q.pop();
dis[s]=;vis[s]=true;q.push(s);
while(!q.empty()){
int now=q.front();q.pop();vis[now]=false;
for(int i=hed[now];i;i=e[i].nxt){
int v=e[i].y;
if(dis[v]>dis[now]+e[i].z){
dis[v]=dis[now]+e[i].z;
ans[s]=max(ans[s],dis[v]);
if(vis[v]==){
vis[v]=true;q.push(v);
}
}
}
}
} int main(){
// freopen("prize.in","r",stdin);
// freopen("prize.out","w",stdout);
n=read();m=read();
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
tarjian(,);
// cout<<sum_col<<endl;
for(int x=;x<=n;x++){
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(bel[v]!=bel[x]&&(po[bel[v]]==||po[bel[x]]==)){
cnt[bel[x]]++;cnt[bel[v]]++;po[bel[v]]=true;po[bel[x]]=true;
add_(bel[v],bel[x],edge[i].z);add_(bel[x],bel[v],edge[i].z);
d[bel[x]]++;d[bel[v]]++;
}
}
}
for(int i=;i<=sum_col;i++)spfa(i);
for(int i=;i<=n;i++)printf("%d\n",ans[bel[i]]);
// fclose(stdin);fclose(stdout);
return ;
}

40

缩点后就是一棵树 ,某个点到树直径的两端距离最大值就是答案

边没判重一直死循环,我觉得重边没关系呀,保险还是判重吧。

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#define N 20010
using namespace std;
map<int,int>ma[N];
int n,m; int sumedge,head[N]; int top,tim,sumcol; int bel[N],Stack[N],instack[N],dfn[N],low[N]; int sume,hed[N]; int maxn,t,d1,d2,dis1[N],dis2[N]; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[(N*)<<]; struct EDGE{
int x,y,z,nxt;
EDGE(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}e[(N*)<<]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} void add_(int x,int y,int z){
e[++sume]=EDGE(x,y,z,hed[x]);
hed[x]=sume;
} void tarjian(int x,int fa){
low[x]=dfn[x]=++tim;
Stack[++top]=x;instack[x]=true;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(instack[v]&&v!=fa)low[x]=min(low[x],dfn[v]);
else if(!dfn[v]){
tarjian(v,x);
low[x]=min(low[x],low[v]);
}
}
if(low[x]==dfn[x]){
sumcol++;
while(Stack[top+]!=x){
bel[Stack[top]]=sumcol;
instack[Stack[top]]=false;
top--;
}
}
} void dfs(int x,int fa){
for(int i=hed[x];i;i=e[i].nxt){
int v=e[i].y;
if(v==fa)continue;
dis1[v]=dis1[x]+e[i].z;
if(dis1[v]>maxn)maxn=dis1[v],t=v;
dfs(v,x);
}
} void dfs_(int x,int fa){
for(int i=hed[x];i;i=e[i].nxt){
int v=e[i].y;
if(v==fa)continue;
dis2[v]=dis2[x]+e[i].z;
dfs_(v,x);
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
for(int i=;i<=n;i++)if(!dfn[i])tarjian(i,-);
for(int x=;x<=n;x++){
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(bel[x]!=bel[v])
if(ma[bel[x]].find(bel[v])==ma[bel[x]].end()){
ma[bel[x]][bel[v]]=;
ma[bel[v]][bel[x]]=;
add_(bel[x],bel[v],edge[i].z);
add_(bel[v],bel[x],edge[i].z);
}
}
}
dfs(,-);
d1=t;memset(dis1,,sizeof(dis1));maxn=;
dfs(d1,-);
d2=t;
dfs_(d2,-);
for(int i=;i<=n;i++)printf("%d\n",max(dis1[bel[i]],dis2[bel[i]]));
return ;
}

11.7noip模拟赛的更多相关文章

  1. 11.7NOIP模拟赛解题报告

    心路历程 预计得分:\(50 + 100 + 100\) 实际得分:\(50 + 100 +100\) T2 T3两道数据结构题美滋滋,然而写完就过去\(3h\)美滋滋 T1数学题学弟们都会做Orzz ...

  2. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  3. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  4. 11.17 模拟赛&&day-2

    /* 后天就要复赛了啊啊啊啊啊. 可能是因为我是一个比较念旧的人吧. 讲真 还真是有点不舍. 转眼间一年的时间就过去了. 2015.12-2016.11. OI的一年. NOIP gryz RP++. ...

  5. 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

    美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...

  6. 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数

    最小公倍数(lcm.c/.cpp/.pas) 题目描述 给定两个正整数,求他们的最小公倍数. 样例输入 28 12 样例输出 84 数据范围 对于40%数据:1<=a,b<=10^9 对于 ...

  7. 11.6NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...

  8. 11.5NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 40 + 30 = 170\) 实际得分:\(100 +100 + 50 = 250\) 辣鸡数据毁我青春 T1一眼不会做感觉要凉 T2好像一波折半搜索就做完了 T ...

  9. 11.1NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 50\) 实际得分:\(100 + 100 + 50\) 感觉老师找的题有点水呀. 上来看T1,woc?裸的等比数列求和?然而我不会公式呀..感觉要凉 ...

随机推荐

  1. Linux 设置中文编码

    Linux 设置中文编码 1.测试是否存在字体列表 fc-list 2.安装字体列表包 yum -y install fontconfig 3.去win系统中找到拷贝字体文件. 路径:C:/Windo ...

  2. NOIP 选择客栈

    描述 丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号.每家客栈都按照某一种色调进行装饰(总共k种,用整数0~ k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费. 两 ...

  3. ubuntu16.04的anacoda内置的spyder不支持中文【学习笔记】

    执行下面的语句:将libfcitxplatforminputcontextplugin.so复制到anaconda2的安装目录下的platforminputcontexts目录重启生效 cp /usr ...

  4. Metasploit – 内网连接

    0x00 问题描述 在渗透测试时,metasploit往往作为后渗透工具,(因为远程溢出越来越少).我一般都是在获得一个webshell后,来使用metasploit进行信息采集,或者内网扫描等操作. ...

  5. redhat6.8链路聚合

    centos 6.X   聚合链路 0.查看NetworkManager服务,停止NetworkManager服务.不做这一步很可能出问题          service NetworkManage ...

  6. 利用war包和Tomcat镜像创建Web镜像

      from hub.c.163.com/library/tomcat:tag #代表以tomcat镜像为基础 MAINTAINER huhuixin 18611551449@163.com #代表所 ...

  7. 3.scala容器

    3.scala容器 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-o ...

  8. 小米智能家居接入智能家居平台homeassistant的方法

    [原文] 在安装和设置完homeassistant之后,我们终于来到激动人心的一步——把智能家居产品接入homeassistant了.把智能家居产品接入homeassistant智能家居平台之后,就可 ...

  9. Python 有点意思

    基本语法 >>> width = 20 >>> height = 2 * 3 >>> width * height 120 >>> ...

  10. jquery attr与prop的区别与联系

    最近开发中发现用attr无法设置checkbox的选中事件,在网上找了下说要用prop,所以总结下两者的区别. 1.操作的对象不同 attr:操作的是HTML文档节点属性 prop:操作的是js对象属 ...