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

#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. 阻塞方法与InterruptedException

    什么是阻塞方法?为什么会抛出InterruptedException? 一般方法的完成只取决于它所要做的事情,以及是否有足够多可用的计算资源(CPU 周期和内存). 而阻塞方法的完成还取决于一些外部的 ...

  2. LeetCode——Number of Boomerangs

    LeetCode--Number of Boomerangs Question Given n points in the plane that are all pairwise distinct, ...

  3. 数组排序array_multisort

    array_multisort --对多个数组或者多维数组进行排序[参考:secure.php.net] 说明: bool array_multisort ( array &$array1 [ ...

  4. IOS-视频

    一.简介 iOS提供了MPMoviePlayerController.MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频 提示:网络音频同样使用此 ...

  5. cassandra压力测试

    http://docs.datastax.com/en/archived/cassandra/2.2/cassandra/tools/toolsCStress.html?hl=stress Simpl ...

  6. 25-THREE.JS 绘制线框样式几何图形的材质 线材质

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  7. ubuntu下安装交叉编译工具链

    /usr/localmkdir arm 将文件file1复制成文件file2 cp file1 file2 /cp /mnt/hgfs/UbuntuGX/arm-2008q3-linux.tar.gz ...

  8. ifconfig 修改IP

    ifconfig 查看IP sudo ifconfig eth0 192.168.1.118 sudo ifconfig eth0 down sudo ifconfig eth0 up ping (w ...

  9. tcp 服务端和客户端程序设计

    一.实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/articl ...

  10. .Net 中的IL中间语言基本语法

    一.前言 IL是什么? Intermediate Language (IL)微软中间语言 C#代码编译过程? C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令: JIT编译器把IL ...