【题目描述】

A 学校的实验室新研制出了一种十分厉害的病毒。由于这种病毒太难以人工制造
了,所以专家们在一开始只做出了一个这样的病毒。
这个病毒被植入了特殊的微型芯片,使其可以具有一些可编程的特殊性能。最重
要的一个性能就是,专家们可以自行设定病毒的分裂能力K,假如现在有x 个病
毒,下一个分裂周期将会有Kx 个一模一样的病毒。你作为该实验室的数据分析
员,需要统计出在分裂到第N 个周期前,一共有多少个病毒单体进行了分裂。一
开始时总是只有一个病毒,这个局面算作第一个周期。由于答案可能很大,专家
们只需要你告诉他们对给定的P 取模后的答案。

【输入】

一行三个整数,依次是K, N, P。

【输出】

一行一个整数,你的答案(对P 取模) 。
输入样例一

   

样例一解释:第一个周期有1 个病毒,产生了一次分裂。第二个周期有1*5=5
个病毒,这五个病毒都会分裂。所以第三个周期前一共进行了1+5 等于6 次分裂。
答案即为6 mod 7 = 6。
输入样例二

   

【数据范围及提示】

测试点编号备注范围
1 ~ 5
P 是质数
1 < K, N, P < 10000
6 ~ 7 1 < N < 10^18
8 ~ 10 P不是质数1 < K , P < 2^31

【解法】

80分,乱搞+利用数据

我们知道这明显是等比数列求和,用公式直接搞,此外利用7(实际上能过8个)个数据点的p是质数的性质快速求逆元

#include <stdio.h>
#include <string.h>
#define maxbuff 1<<20
#define ll long long
#define set_file(File) freopen(File".in", "r", stdin), freopen(File".out", "w", stdout)
#define close_file() fclose(stdin), fclose(stdout)
char buff[maxbuff], *iter = buff;
template<class Type> inline void read(register Type &x)
{
x = 0;
while(*iter < '0' || *iter > '9') ++iter;
while(*iter >= '0' && *iter <= '9') x = x * 10 + *iter++ - '0';
}
ll k, n, mo, ans;
ll inv(ll n, ll p)
{
ll ret = 1;
for(ll i = p; i; i >>= 1, n = (n * n) % mo)
if(i & 1) ret = (ret * n) % mo;
return ret;
}
ll pow(ll n, ll t)
{
ll ret = 1;
for(; t; t >>= 1, n = (n * n) % mo)
if(t & 1) ret = (ret * n) % mo;
return ret;
}
int main()
{
set_file("split");
fread(buff, 1, maxbuff, stdin);
read(k), read(n), read(mo);
ans = pow(k, n - 1) - 1;
if(ans < 0) ans += mo;
ans = (ans * inv(k - 1, mo - 2)) % mo;
printf("%I64d\n", ans);
close_file();
return 0;
}

100分,一种不是很协调的方法。直接考虑保留分母的因子,也就是将mod数乘上个分母,之后加个快速乘加速

#include <stdio.h>
#include <string.h>
#define maxbuff 1<<20
#define ll long long
#define set_file(File) freopen(File".in", "r", stdin), freopen(File".out", "w", stdout)
#define close_file() fclose(stdin), fclose(stdout)
char buff[maxbuff], *iter = buff;
template<class Type> inline void read(register Type &x)
{
x = 0;
while(*iter < '0' || *iter > '9') ++iter;
while(*iter >= '0' && *iter <= '9') x = x * 10 + *iter++ - '0';
}
ll k, n, mo, ans, P;
ll mul(ll x, ll y)
{
ll ret = 0;
for(; y; y >>= 1, x = (x + x) % P)
if(y & 1) ret = (ret + x) % P;
return ret;
}
ll pow(ll n, ll t)
{
ll ret = 1;
for(; t; t >>= 1, n = mul(n, n))
if(t & 1) ret = mul(ret, n);
return ret;
}
int main()
{
set_file("split");
fread(buff, 1, maxbuff, stdin);
read(k), read(n), read(mo);
P = (k - 1) * mo;
ans = ((pow(k, n - 1) - 1 + P) % P/ (k - 1)) % mo;
printf("%I64d\n", ans);
close_file();
return 0;
}

  

[第一波模拟\day2\T1] {病毒分裂}(split.cpp)的更多相关文章

  1. [第一波模拟\day1\T2]{分班}(divide.cpp)

    [题目描述] 小N,小A,小T又大了一岁了. 现在,他们已经是高二年级的学生了.众所周知,高二的小朋友是要进行文理科分班考试的,这样子的话,三个好朋友说不定就会不分在一个班. 于是三个人决定,都考平均 ...

  2. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  3. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  4. Noip2014 提高组 Day1 T1 生活大爆炸版石头剪刀布 + Day2 T1 无线网络发射器选址

    Day1 T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升 ...

  5. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

  6. [第一波模拟\day3\T3]{益智游戏}(game.cpp)

    [问题描述] 小P和小R在玩一款益智游戏.游戏在一个正权有向图上进行. 小P控制的角色要从A点走最短路到B点,小R控制的角色要从C点走最短路到D点. 一个玩家每回合可以有两种选择,移动到一个相邻节点或 ...

  7. [第一波模拟\day3\T2]{独立集}(bubble.cpp)

    [问题描述] 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独 ...

  8. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  9. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

随机推荐

  1. EditPlus 3:设置自动换行

    打开软件,菜单栏点击Document,再在下拉栏中点击Permanent Settings,然后在弹出的设置框中找到Word Wrap点击,最后在弹出的小框中勾选第一个Enable word wrap ...

  2. python之类的相关名词解释

    变量:在类里面定义的变量,不必实例化即可调用 实例变量:在类里面定义的变量,必须实例化之后才可以调用 比如: 属性方法:调用时看起来像是一个变量,方法没有入参,可以变成一个属性方法 在方法上添加@pr ...

  3. Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)

    题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...

  4. Graph HDU - 4467

    https://vjudge.net/problem/HDU-4467 大概就是,设一个块大小T 对于度数<=T的点,设为1类点,在改变颜色的时候暴力查询与其相邻点,更新答案 对于度数>T ...

  5. 递推DP URAL 1244 Gentlemen

    题目传送门 /* 题意:给出少了若干卡片后的总和,和原来所有卡片,问少了哪几张 DP:转化为少了的总和是否能有若干张卡片相加得到,dp[j+a[i]] += dp[j]; 记录一次路径,当第一次更新的 ...

  6. SQL 语句学习

     Sql语句学习 一. select playerId, count(playerId) as num from OperateLog_$i where playerId > 0 and roo ...

  7. pyton 基础,运算符及字符类型。

    一.python运算符: 二.数据类型: 1.数字: int  :整型 32位机器上一个整数取值范围为-2**31~2**31-1即-2147483648~2147483647 64位机器上一个整数取 ...

  8. Java-每日编程练习题③

    一.计算圆周率 中国古代数学家研究出了计算圆周率最简单的办法: PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17...... 这个算式的结果会无限接近于圆周率的值, ...

  9. CF765C Table Tennis Game 2

    题意: Misha and Vanya have played several table tennis sets. Each set consists of several serves, each ...

  10. 教你如何配置WampServer

    httpdconfig 搜索deny 268行 Deny 换成Allow 在本机cmd 搜索 ipconfig 找到 本机的ip 地址 239 行 DocumentRoot "e:/mywe ...