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

#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. 多线程、多进程、协程、IO多路复用请求百度

    最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...

  2. 用“倍增法”求最近公共祖先(LCA)

    1.最近公共祖先:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.的祖先且x的深度尽可能大. 2.朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找 ...

  3. CocoaPods学习系列2——使自己的项目支持CocoaPods管理

    该篇记录使自己的项目支持CocoaPods管理. 要达到这一目的,需要如下步骤: 1.将自己的项目提交到github,添加开源协议license 2.添加podspec文件 3.验证podspec,成 ...

  4. iOS CoreData (二) 版本升级和数据库迁移

    前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...

  5. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  6. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...

  7. C语言小知识点汇集

    1. 三元表达式“?:”冒号两边的两个操作数类型必须一致. 2. 枚举变量的sizeof值同int型一样为4. 3. 为了消除不必要的计算 &&两侧的表达式,当左侧即第1个表达式不成立 ...

  8. MS Project 如何删除前置任务

  9. 014——VUE中v-if语法在网站注册中的实际应用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 019对象——对象 method_exists property_exists instanceof

    <?php /** * 19 对象 method_exists property_exists instanceof */ //method_exists() 判断方法是否存在,第一个参数对象或 ...