[SinGuLaRiTy] NOIP模拟赛(TSY)-Day 2
【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 |
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 |
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的更多相关文章
- [SinGuLaRiTy] NOIP模拟赛(TSY)-Day 1
[SinGuLaRiTy-1032] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
随机推荐
- 一张图看懂------left join;right join;inner join
- 2015.5.21 VS2010中引用Word组件后提示 类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函数 解决方法
wordApp = new Word.ApplicationClass();//这句在VS2005中没问题,在2010中会报错. 解决方法:在资源管理器 “引用”项的"Microsoft.O ...
- Solaris11修改主机名
在Solaris10中,主机名的修改是通过修改相关的配置文件实现的.在Solaris11中,主机名的配置信息已经转移到SMF配置库中,因此修改主机名的方式与Solaris10完全不同.以下是修改Sol ...
- springmvc 中异常处理
springmvc 中异常处理常见三种处理方式: 1:SimpleMappingExceptionResolver处理的是处理器方法里面出现的异常 2 3.自定义异常处理器:处理的是处理器方法里面出现 ...
- springmvc 注解式开发 处理器方法的返回值
1.返回void -Ajax请求 后台: 前台: 返回object中的数值型: 返回object中的字符串型: 返回object中的自定义类型对象: 返回object中的list: 返回object中 ...
- JAVA基础知识总结10(包类)
包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...
- to_date() 、to_char()、to_number的FMT格式
元素 含义 结果:2018/01/12(周五) - / , . ; : (6中不同分隔符) 分隔符 y 显示一位年份 8 yy 显示二位年 ...
- WINFORM 无边框窗体 阴影与移动
//窗体移动API[DllImport("user32.dll")]public static extern bool ReleaseCapture();[DllImport(&q ...
- [转]CSS块级元素和行内元素
原地址:http://www.studyofnet.com/news/398.html 本文导读:HTML中的元素可分为两种类型:块级元素和行级元素.这些元素的类型是通过文档类型定义(DTD)来指明. ...
- R: 正则表达式
正则表达式: 例:sub("a","",c("abcd","dcba")): [1] "bcd" ...