【SinGuLaRiTy-2033】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.

                            

A

题目描述

给出三个整数a,b,c,令m=a^b,求φ(m) mod c和2*∑(i,i<=m)i*[gcd(i,m)=1] mod c。

输入

第一行输入三个正整数a、b、c。

输出

输出两个整数,即φ(m) mod c和2*∑(i,i<=m)i*[gcd(i,m)=1] mod c。

样例数据

样例输入 样例输出
8 1 7 4 4

<样例解释>

欧拉函数定义:小于或等于n的数中,与n互质的数的个数。
φ(8)=4,1,3,5,7满足条件,于是2*(1+3+5+7) mod 7=4。

<数据范围>

对于100%的数据,a,b<=10^12,c<=10^9。

解析

首先,要知道求欧拉函数的公式:

1、结合公式可以得出:φ(a^b)=φ(a)*a^(b-1);
2、∑(i,i<=m)i*[gcd(i,m)=1] mod c怎么求呢?φ(n)=m,这m个与a互质的数之和sum=∑bi。对于一个bi,有gcd(n,bi)=1 -> gcd(n-bi,bi)=1。sum=∑n-bi。
两式相加:ans*2=∑n-bi+bi=m*n=φ(n)*n。
好吧,此题的代码实现非常简单:快速幂+欧拉函数(都是模板啊~)
有一点要注意,当b=0时,显然有φ(a^0)=φ(1)=1,需要特判然后直接输出"1 2"。其实模数c是否为素数对此题并没有什么影响,TSY本来还想再搞一个中国剩余定理的......

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib> #define LL long long using namespace std; LL a,b,mod; LL ksm(LL a,LL cnt)
{
a%=mod;
LL ans=;
while(cnt)
{
if(cnt&)
ans=ans*a%mod;
a=a*a%mod;
cnt>>=;
}
return ans;
} LL get_phi(LL n)
{
LL ans=n;
int number=(int)sqrt(n+0.5);
for(int i=;i<=number;i++)
{
if(n%i==)
{
ans=ans/i*(i-);
do
{
n/=i;
}
while(n%i==);
}
}
if(n>)
ans=ans/n*(n-);
return ans;
} int main()
{
cin>>a>>b>>mod;
if(b==)
{
printf("1 2");
return ;
}
LL ans=get_phi(a)%mod*ksm(a,b-)%mod;
cout<<ans<<' '<<ans*ksm(a,b)%mod;
return ;
}

B

题目描述

给出一个长度为n的数列。
定义f(i,j)表示下标属于[i,j]的数组成的集合中,最大的元素的下标;如果有多个最大元素,取位置靠前的。
求满足f(l,r)=k(l<=r,k∈[1,n])的有序数对f(l,r)的个数。
由于输入过多,你需要用到输入优化。
由于输出过多,你只需输出这n个整数的异或值。

输入

第一行输入一个整数n。
第二行输入n个整数,即这个数列。

输出

输出一行一个整数,即这n个整数的异或值。

样例数据

样例输入 样例输出

4
2 3 4 1

4

<样例解释>

f(l,r)=1:(1,1)
f(l,r)=2:(1,2),(2,2)
f(l,r)=3:(1,3),(1,4),(2,3),(2,4),(3,4),(4,4)
f(l,r)=4:(4,4)

<数据范围>

对于100%的数据,n<=3*10^6,

解析

ans_i=(i-f_i)*(g_i-i)
其中fi表示在i之前第一个大于或等于ai的数的下标,gi表示在i之后第一个大于或等于ai的数下标。
可以通过单调栈来求这两个数组,下面只说f数组的求法。
从左往右扫描数组,用一个从栈底到栈顶单调不增的栈来维护:访问到ai时,不断弹出栈顶元素,直到栈顶元素小于等于ai为止;此时栈顶元素的位置就是fi;然后再将当前的元素再加入栈顶,此时这个栈仍然满足原来的单调性质。
时间复杂度:O(n)。

Code

#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream> #define MAXN 3000010 typedef long long LL; using namespace std; int num;
int data[MAXN],pre[MAXN],aft[MAXN];
int tool,x[MAXN]; char w;
inline void GET(int &t)
{
t=;
do w=getchar();while(w<''||w>'');
do{t=t*+w-'';w=getchar();}while(w>=''&&w<='');
} int main()
{
/*
pre[i]数组:记录的是data[i]之前的最后一个比它大的值的位置
aft[i]数组:记录的是data[i]之后的第一个比它大的值的位置
*/
GET(num);
for(int i=;i<=num;i++)
{
GET(data[i]);
}
pre[]=;
x[++tool]=; for(int i=;i<=num;i++)
{
while(tool&&data[i]>data[x[tool]])
{
tool-=;
}
if(tool!=)
{
pre[i]=x[tool];
}
else
{
pre[i]=;
}
x[++tool]=i;
} aft[num]=num+;
tool=;
x[tool]=num;
for(int i=num-;i;i--)
{
while(tool&&data[i]>=data[x[tool]])
{
tool-=;
}
if(tool!=)
{
aft[i]=x[tool];
}
else
{
aft[i]=num+;
}
x[++tool]=i;
} LL ans=;
/*
i-f[i]:表示在这之间的数的个数
g[i]-i:表示在这之间的数的个数
*/
for(int i=;i<=num;i++)
ans^=1LL*(i-pre[i])*(aft[i]-i);
cout<<ans;
return ;
}

C

题目描述

2017夏,一个有n个县城的小城经历长达几天的暴雨,m条城市道路全部被洪水冲断,救援队员紧急出动,修复n-1条道路使得这n个县城两两相通。现在救援队队长想知道修复哪些道路使得任意两个县城之间的最短距离的最大值最小。

输入

第一行输入两个整数n、m,分别表示有n个县城和m条道路。
接下来的m行输入三个整数u、v、l,表示一条从县城u到县城v的双向道路,l表示这条道路的长度。

输出

输出一个整数即任意两个县城之间距离的最大值的最小值。

样例数据

样例输入 样例输出

4 4
1 2 5
2 3 1
2 4 2
3 4 4

7

<数据范围>

对于100%的数据,n<=300,m<=50000,l<=10000。

解析

直接二分是会超时的!(二分复杂度:O(n^3+mn*logX))于是我们需要考虑一个神奇的优化,优化之后的时间复杂度为O(n^3+mn)。

具体的解法,还是看题解吧。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> #define MAXN 305
#define min(a,b) ((a)<(b)?(a):(b)) using namespace std; int n,m,mat[MAXN][MAXN],rnk[MAXN][MAXN],edge[MAXN*MAXN>>][];
int tmp,ans; bool cmp(int a,int b)
{
return mat[tmp][a]<mat[tmp][b];
} int main()
{
memset(mat,0x3f,sizeof mat);
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
mat[i][i]=;
int u,v,l;
for(int i=;i<=m;++i)
{
scanf("%d%d%d",&u,&v,&l);
mat[u][v]=mat[v][u]=l;
edge[i][]=u;
edge[i][]=v;
ans+=l;
}
for(int k=;k<=n;++k)
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]);
for(int i=;i<=n;++i)
{
for(int j=;j<=n;++j)
rnk[i][j]=j;
tmp=i;
sort(rnk[i]+,rnk[i]+n+,cmp);
}
for(int i=;i<=m;++i)
{
u=edge[i][];
v=edge[i][];
ans=min(ans,min(mat[u][rnk[u][n]],mat[v][rnk[v][n]])*);
for(int tmp=n,i=n-;i;--i)
{
if(mat[v][rnk[u][i]]>mat[v][rnk[u][tmp]])
{
ans=min(ans,mat[u][rnk[u][i]]+mat[u][v]+mat[v][rnk[u][tmp]]);
tmp=i;
}
}
}
printf("%d",ans);
return ;
}

Time: 2017-07-28

[SinGuLaRiTy] NOIP模拟赛(TSY)-Day 2的更多相关文章

  1. [SinGuLaRiTy] NOIP模拟赛(TSY)-Day 1

    [SinGuLaRiTy-1032] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.                              ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

随机推荐

  1. 通过扫码自定义链接安装iOS app,版本更新总结。

    1.打包ipa,plist工具:xcode6证书:企业级开发证书 1.1)xcode6开始企业级打包时不在生成plist,需要自己编写:模版见下: <?xml version="1.0 ...

  2. 嵌入式系统LINUX环境搭建

    Linux kernel Complier: http://supportopensource.iteye.com/blog/680483 sudo make mrproper         净化解 ...

  3. [0day]jQuery Mobile XSS

    漏洞影响范围: 任何一个website使用了 jQuery Mobile 并且开放了重定向都有可能存在XSS,并且目前还没有相关补丁信息. 应用介绍: jQuery Mobile是jQuery 框架的 ...

  4. Drools学习笔记2—Conditions / LHS 匹配模式&条件元素

    Rule的LHS由条件元素(Conditional Elements—CE)和匹配模式(Patterns)组成 Patterns被用来指示出fact的字段约束 每个约束必须为true才能让RHS的ac ...

  5. [Python Study Notes]行人检测

    # -------------------------------------------------------------- # @文件: 行人识别.py # @工程: blog # @时间: 2 ...

  6. show table detail

    create table #t(name varchar(255), rows bigint, reserved varchar(20),data varchar(20), index_size va ...

  7. C++对二进制文件的操作实例

    有5个学生的数据,要求: (1)将它们存放到磁盘文件中: (2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来: (3)将第三个学生的数据修改后存回磁盘文件中的原有位置: (4)从磁盘文件读 ...

  8. 面试题:hibernate第三天 一对多和多对多配置

    1.1 一对多XML关系映射 1.1.1 客户配置文件: <?xml version="1.0" encoding="UTF-8"?> <!D ...

  9. vray学习笔记(5)-学习资料

    首先肯定是vray的官方的资料了: 一个是教程 https://docs.chaosgroup.com/display/VRAY3MAX/Tutorials 一个是帮助文件 https://docs. ...

  10. HDU 3974 Assign the task (DFS+线段树)

    题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...