挑战nbc——数论的威压(8.21 T1)

挑战nbc

题目描述:

Abwad是一名有志向的优秀OI少年。遗憾的是,由于高能宇宙射线的影响,他不幸在NOI中滚粗。不过,Abwad才高一,还有许许多多的机会。在长时间的刻苦学习之后,他实力大增,并企图撼动OI界魔王nbc的权威。

这一天,Abwad决定挑战nbc。挑战的项目是OI界一种常见的运动:造题,比的就是谁造得又快又好。Abwad现在拿到了难度为1,2,3,……,n的n道原题,每次操作他可以挑出任意两道题,并使用一种叫做“NOIP二合一”的方法合成一道难度为其平均值的题。Abwad希望在操作了n-1次之后,最后剩下的那道题难度最大。

输入格式:

一行一个整数,表示n。

输出格式:

一行一个整数ans,若答案的最简分数为x/y,ans应为最小的满足ans*y mod 1000000007=x的整数。(其实就是分数取模辣)

样例输入:

样例1:
2

样倒2:
100

样例输出:

样例1:
500000005

样例2:
958557238

提示:

【样例1说明】

显然答案是3/2,500000005*2 mod 1000000007=3

【可能用到的知识】

费马小定理:当p是质数时,ap-1 mod p=1

时间限制:1000ms空间限制:256MByte

这个题目是在初步学习数论之后的第一个和目前数论知识能够比较接轨的题目。因为是随机生成的数据,所以我暴力做法都能够拿到70分。但是这并不是正解,就不贴上来了。然后我们将这个问题拆成两个问题,一:求x/y,二:求ans。第一个问题的话应该很好解决,应该先加最小的,最后加最大的,然后这个部分直接模拟应该就可以了。但是其实很明显,这个会超时的,所以我们需要寻找通项公式,先找x,当n=1,2,3,4……时,x=1,3,9,25……。然后根据数学归纳法可以知道x的通项公式x=(n-1)*2(n-1)+1,同理可得y=2(n-1),然后ans=x/y(mod p) 然后1/y可以由逆元得出(逆元+费马小定理)1/y=y(p-2)再将y的逆元乘x即可得到ans。

#include<bits/stdc++.h>
using namespace std;
const long long P=1000000007;
long long n,x,y,ans;
int fastpow(int a,int b){
	long long r=1,base=a;
	while (b){
		if (b&1) r=(r*base)%P;
		base=(base*base)%P;
		b>>=1;
	}
	return r;
}
int main(){
	cin>>n;
	x=fastpow(2,n-1);
	x=(x*(n-1)+1)%P;
	y=fastpow(2,n-1);
	ans=x*fastpow(y,P-2)%P;
	cout<<ans;
	return 0;
}

身为一个数论渣渣,第一写一个数论题目的题解,还有一点小激动。

时间: 2024-11-05 14:42:00

挑战nbc——数论的威压(8.21 T1)的相关文章

python进阶学习(一)--多线程编程

1. 多线程 概念:简单地说操作系统可以同时执行多个不用程序.例如:一边用浏览器上网,一边在听音乐,一边在用笔记软件记笔记. 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务"一起"执行(实际上总有一些任务不在执行,因为切换任务的熟度相当快,看上去一起执行而已) 并行:指的是任务数小于等于CPU核数,即任务真的是一起执行的. 2. 线程 概念:线程是进程的一个实体,是CPU调度和分派的基本单位. threading--单线程执行: 1 import ti

多线程概念

一个进程是由一个或者N个线程组成的! 线程:cpu调度和分配的基本单位!电脑中真正执行的是线程! 在同一个时间点,我们的电脑只能运行一个线程 多线程: 如果在一个进程中,同时运行多个线程,来完成不同的工作,我们称之为多线程! CUP不能同时运行多个线程! 一个CPU在同一个时间点,只能运行一个线程,单线程运行的速度太快,我们肉眼无法分辨,所以我们认为是多线程! 生活中进入地铁站的例子: 场景1:现在地铁站有1个进站口,同时来了5个人! 需要排队进站! 场景2:现在地铁站有5个进站口,同时来了5个

【转】数据库锁机制

1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程.T3,T4以此类推.下面以SQL Server(2005)为例. 2 锁的种类 共享锁(Shared lock). 例1: ---------------------------------------- T1: select * from table (请想象它需要执行

【下班后学js】判断传入的两个数组是否相似

1 /* 2 * param1 Array 3 * param2 Array 4 * return true or false 5 */ 6 function arraysSimilar(arr1, arr2){ 7 if (arr1 instanceof Array){ 8 return false; 9 } 10 if (arr2 instanceof Array){ 11 return false; 12 } 13 if (arr1.length !== arr2.length){ 14

Java - Thread 和 Runnable实现多线程

Java多线程系列--"基础篇"02之 常用的实现多线程的两种方式 概要 本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程池的内容,我们以后会详细介绍:现在,先对的Thread和Runnable进行了解.本章内容包括:Thread和Runnable的简介Thread和Runnable的异同点Thread和Runnable的

JAVA中的多线程(八):线程的优先级和yield方法

优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runnable 2 { 3 public void run() 4 { 5 for(int x = 0; x < 70; x++) 6 { 7 System.out.println(Thread.currentThread().toString()+"..."+x); 8 Thread.yield(); 9 } 10 } 11 } 12 13 c

rocketMQ的运行示例代码

rocketMQ的示例代码 1 import com.alibaba.rocketmq.client.exception.MQBrokerException; 2 import com.alibaba.rocketmq.client.exception.MQClientException; 3 import com.alibaba.rocketmq.client.producer.DefaultMQProducer; 4 import com.alibaba.rocketmq.client.pr

线程的基本操作

初始线程:1.新建线程 1)继承Thread类 2)实现Runnable接口2.线程终止 除非你很清楚你在做什么,否则不要随便使用stop()方法来停止一个线程.因为stop()方法太过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题. 通过定义标记变量stopme,当stopme=true时,在run内部返回结果或跳出循环.3.线程中断 线程中断是一种重要的线程协作机制.严格地讲,线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出啦!至于目标线

数据库锁机制

1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程.T3,T4以此类推.下面以SQL Server(2005)为例. 2 锁的种类 共享锁(Shared lock). 例1: ---------------------------------------- T1: select * from table (请想象它需要执行