A.Return

出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面。可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清。(鬼知道"那么输出-1"之前还用不用写Case啊)

直接排序去重,lowerbound找到有序数组里每个元素的位置统计答案即可。(考察知识:STL的熟练运用)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10005;
typedef long long ll;
const ll mod=0x7fffffff;
int n;
ll a[N],b[N];
void work(int CASE)
{
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),b[i]=a[i];
sort(b+1,b+n+1);
int len=unique(b+1,b+n+1)-b-1,ans=0;
if(len==1)
{
ans=-1;
goto nxt;
}
for(int i=1;i<=n;i++)
{
int pos=lower_bound(b+1,b+len+1,a[i])-b;
ll nxt,pre; if(pos==1)pre=b[len];
else pre=b[pos-1];
if(pos==len)nxt=b[1];
else nxt=b[pos+1];
if((pre+a[i])%mod==nxt)ans++;
}
nxt:cout<<"Case #"<<CASE<<": "<<ans<<endl;
}
int main()
{
int CASE=0;
while(scanf("%d",&n)==1)
{
CASE++;
work(CASE);
}
return 0;
}

B.One

把约瑟夫问题的递推式倒过来即可,$ans=(ans+i) \% (n-i+1)$。

至于柿子的含义?倒序枚举的i是第几轮,我们给每一轮剩下的人重新编号,已知最后幸存者的编号为1,那么就可以通过“每轮在幸存者上跳i次”的性质推出上一轮这个人的编号是几。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int T,n;
inline int read();
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("1.out","w",stdout); T=read();
while(T--)
{
n=read();
int ans=1;
for(int i=n;i;i--)
{
ans=(ans+i)%(n-i+1);
}
printf("%d\n",ans+1);
}
}
inline int read()
{
int s=0,f=1;char a=getchar();
while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
return s*f;
}

C.Magic

这题如果不卡常还是不错的,考察知识非常综合,不过没什么思维含量就直接把欧拉定理lucas定理中国剩余定理费马小定理乘法逆元堆在一起就好啦。

当时看到$[gcd(i,N)==1]$虎躯一震,还以为要反演。其实直接暴力统计就行了。降幂的话可以欧拉定理对指数取模,不过$\varphi (p)$不是质数,所以求出在它的每一个质因子模意义下的答案后用CRT合并,质因子比较小所以要lucas防止出0。最后直接快速幂得到答案。

至于卡常……直接循环展开就行,还有就是枚举$i \in n$时可以只枚举到$\frac{n}{2}$,因为如果$gcd(i,n)\neq 1$,那么$gcd(i,n-i)\neq 1$也成立。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define re register
typedef long long ll;
const ll mod=54184622;
const ll phi=27092310;
const ll pr[6]={2,3,5,7,129011};
const int N=1000005;
ll fac[6][N],inv[6][N],t[6],m[6];
ll n,g;
inline ll qpow(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
inline ll gcd(ll x,ll y)
{
if(!y)return x;
return gcd(y,x%y);
}
inline ll C(ll x,ll y,int i)
{
if(y>x)return 0;
return fac[i][x]*qpow(fac[i][y],pr[i]-2,pr[i])%pr[i]*qpow(fac[i][x-y],pr[i]-2,pr[i])%pr[i];
}
ll lucas(ll x,ll y,int i)
{
if(!y)return 1;
return C(x%pr[i],y%pr[i],i)*lucas(x/pr[i],y/pr[i],i)%pr[i];
} ll merge(ll x,ll y)
{
if(y>x)return 0;
ll res=0;
ll val=lucas(x,y,0);
(res+=val*m[0]*t[0])%=phi;
val=lucas(x,y,1);
(res+=val*m[1]*t[1])%=phi;
val=lucas(x,y,2);
(res+=val*m[2]*t[2])%=phi;
val=lucas(x,y,3);
(res+=val*m[3]*t[3])%=phi;
val=lucas(x,y,4);
(res+=val*m[4]*t[4])%=phi; return (res+phi)%phi;
} int main()
{
scanf("%lld%lld",&n,&g);
fac[0][0]=1;
for(re int j=1;j<=2;j++)
fac[0][j]=fac[0][j-1]*1LL*j%pr[0];
m[0]=phi/pr[0];
t[0]=qpow(m[0],pr[0]-2,pr[0]);
fac[1][0]=1;
for(re int j=1;j<=3;j++)
fac[1][j]=fac[1][j-1]*1LL*j%pr[1];
m[1]=phi/pr[1];
t[1]=qpow(m[1],pr[1]-2,pr[1]);
fac[2][0]=1;
for(re int j=1;j<=5;j++)
fac[2][j]=fac[2][j-1]*1LL*j%pr[2];
m[2]=phi/pr[2];
t[2]=qpow(m[2],pr[2]-2,pr[2]);
fac[3][0]=1;
for(re int j=1;j<=7;j++)
fac[3][j]=fac[3][j-1]*1LL*j%pr[3];
m[3]=phi/pr[3];
t[3]=qpow(m[3],pr[3]-2,pr[3]);
fac[4][0]=1;
for(re int j=1;j<=129011;j++)
fac[4][j]=fac[4][j-1]*1LL*j%pr[4];
m[4]=phi/pr[4];
t[4]=qpow(m[4],pr[4]-2,pr[4]);
ll tot=0;
for(re int i=1;i*2<=n;i++)
if(gcd(i,n)==1){
(tot+=merge(g,i))%=phi;
if(i*2!=n)
(tot+=merge(g,n-i))%phi;
}
ll ans=qpow(n,tot,mod);
cout<<ans<<endl;
return 0;
}

[NOIP模拟测试30]题解的更多相关文章

  1. noip模拟测试30

    考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min ...

  2. [NOIP模拟测试38]题解

    来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...

  3. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  4. [NOIP模拟测试31]题解

    A.math 考场乱搞拿了95,2333. 考虑裴蜀定理:$ax+by=z$存在整数解,当且仅当$gcd(a,b)|z$. 那么如果某个数能够被拼出来,就必须满足所有$a_i$的$gcd$是它的因子. ...

  5. [NOIP模拟测试12]题解

    A. 找规律题.儿子的编号减去 小于它编号的最大的fibonacci数 即可得到它父亲的编号. 然后两个节点都暴力上跳就好了.预处理一下fibonacci数,每次二分查找即可. #include< ...

  6. [NOIP模拟测试11] 题解

    A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...

  7. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  9. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

随机推荐

  1. Android内存tips

    1. Android应用程序的默认最大内存值为16M,如何修改Android应用程序的默认最大内存值? 修改或添加/system/build.prop中的配置项: root@NX551J:/syste ...

  2. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

    题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...

  3. 2019 牛客暑期多校 第二场 H Second Large Rectangle (单调栈)

    题目:https://ac.nowcoder.com/acm/contest/882/H 题意:一个大的01矩阵,然后现在要求第二大的全一矩阵是多少 思路:在这里我们首先学习一下另一个东西,怎么求直方 ...

  4. 2018-2019-2 20175126谢文航 实验三《敏捷开发与XP实践》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年5月2日 实验时间:--- 实验序号:实验三 实验名称:敏捷开 ...

  5. VB.NET导出Excel 轻松实现Excel的服务器与客户端交换 服务器不安装Office

    说来VB.Net这个也是之前的一个项目中用到的.今天拿来总结下用途,项目需求,不让在服务器安装Office办公软件.这个也是煞费了一顿. 主要的思路就是 在导出的时候,利用DataTable做中间变量 ...

  6. Maven之自定义pom类型的基础项目

    摘要:在当前的软件开发场景中,大都是通过maven管理项目,而如果使用maven的话,其实也会有很多问题,比如项目中依赖的版本管理就是一个很头疼的事,如果一个项目中有很多人同时开发那么这就很可能造成大 ...

  7. rabbitmq for C#的异步消息确认机制

    代码: using (var conn = RabbitmqHelper.GetConnection()) { using (var channel = conn.CreateModel()) { / ...

  8. id4用用户名和密码方式控制身份验证

    建议看这个文章的时候先学习一下B站的id4教程以及文章中推荐的事例教程和官方例子: https://www.jianshu.com/p/259ef2256ec5

  9. leetcode-解题记录 206. 反转链表

    题目 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可 ...

  10. xshell设置选中复制,右击粘贴功能

    . 设置选中复制: 工具--->选项--->键盘和鼠标--->(然后根据下图设置保存即可) 2. 设置ctrl + v 粘贴功能: 工具--->选项--->键盘和鼠标-- ...