SPOJ BLAMOEBA - Super Amoeba

题目链接http://www.spoj.com/problems/BLAMOEBA/

题目大意:有一种叫做阿米巴的虫子一天能分裂成M个虫子。现有X个这种虫子,从第一天开始进行分裂,每次分裂之后就取走Y个,问如果要第N天取走之后不再有虫子剩余,并且X尽可能小,那么X和Y应该为多少。2 < M < 100000 ,1 < N < 100000

解题思路:分析后可以得到 (mn-1)Y = mn(m-1)X. 那么关键就是对这个式子两边约分,当X,Y两个系数互素的时候就是答案了。如何约分呢?首先考虑 mn-1 与 m-1 的关系。

m % (m-1) = 1 ----> mn % (m - 1) = 1 ----> (mn - 1) % (m - 1) = 0. 所以,左右两边可以同时除以 m - 1。之后,由于 mn - 1 可以分解为 (m - 1) * (a1mn-1 + a2mn-2+...+am + 1) ,因此除以 m - 1 之后两者已经互素。

接下来就可以利用快速幂取模以及逆元来求X,Y对应的值了。

代码:

 1 ll n, m;
 2
 3 ll ext_gcd(ll a, ll b, ll &d, ll &x, ll &y){
 4     if(b) {
 5         ext_gcd(b, a % b, d, y, x); y -= x * (a / b);
 6     }
 7     else{
 8         d = a; x = 1; y = 0;
 9     }
10 }
11 ll pow_mod(ll a, ll b){
12     if(b == 0) return 1;
13     ll tmans = pow_mod(a, b / 2);
14     ll ans = tmans * tmans % mod;
15     if(b & 1) ans = a % mod * ans;
16     return ans % mod;
17 }
18 void solve(){
19     ll up = pow_mod(m, n);
20     ll x, y, d;
21     ext_gcd(m - 1, mod, d, x, y);
22     if(x < 0) x = (abs(x) / mod + 1) * mod + x;
23     ll dn = (up - 1) * x % mod;
24     printf("%lld %lld\n", dn, up);
25 }
26 int main(){
27     int t;
28     scanf("%d", &t);
29     while(t--){
30         scanf("%lld %lld", &m, &n);
31         solve();
32     }
33 }

题目:

BLAMOEBA - Super Amoeba

#math

Peter has an amoeba farm with pretty much unlimited amoebae. After years of research, Peter created a device to convert some amoebae to super amoebae. However, his device can only be used once. Every day, a super amoeba will split into M super amoebae (2 < M < 100000).

Now, Peter plan his amoeba selling business. Initially, Peter converts X amoebae to super amoebae (X > 1). Every day after the amoebae split, Peter will take Y super amoebae for sale (Y > 1). After N days, Peter want all of his amoebae to be completely sold out (1 < N < 100000). Since the energy needed to convert amoebae is quite massive, X must be as small as possible. Help peter plan his business!

Input

First line is T, number of test cases (T < 100000). Next T lines each contains M and N separated by space.

Output

For each case, output X and Y separated by space. Since X and Y can be very large, output them with modulo 1000000007.

Example

Input:
14 3

Output:
21 64

Explanation

Initially, Peter has 21 super amoebae.
After day 1, there are 4 x 21 - 64 = 20 super amoebae
After day 2, there are 4 x 20 - 64 = 16 super amoebae
After day 3, there are 4 x 16 - 64 = 0 super amoeba
All the super amoebae are sold out after the 3rd day just as planned.

时间: 2024-10-25 03:59:10

SPOJ BLAMOEBA - Super Amoeba的相关文章

SPOJ 3273 - Order statistic set , Treap

原文  http://gashero.iteye.com/blog/2075324 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 7   枚举与结构 1   简介 今天凌晨Apple刚刚发布了Swift编程语言,本文从其发布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&OSX开发有所帮助. Swift是供iOS和OS X应用编程的新编程语言,基于C和Obje

keepalived+amoeba+mysql-mmm+mysql实现mysql读写分离及高可用

最近尝试了一下mysql的读写分离和高可用的搭建.搭好之后体验了一下,效果还不错.这里跟大家分享一下. 1.首先介绍一下mysql-mmm这个工具是干嘛使的? 众所周知,mysql自身提供了AB复制.我们也可以很轻松的实现master-master双向复制,同时再为其中的一个master节点搭建一个slave库.这样就实现了master1与master2之间的双向复制,同时master1与slave1之间主从复制这样的架构.这样整个体系中就存在两个master,正常情况下只有一个master对外

MMM架构实现MySQL高可用读写分离(进阶版,包含Amoeba)

前两天逛博客偶然发现了某大神写的关于MMM的文章,看完就迫不及待的自己试了一下,大神写的很顺畅,以为自己也能操作的很顺畅,但是实际情况是手脚太不麻利,碰到很多坑,如果大神的文章是"平地起高楼",那我这篇则是"平房起别墅",因为我生产环境中已经有两台Mysql做双主同步,这篇文章说的是如何改造升级现有架构! 环境介绍: IP 操作系统 数据库 软件 角色/VIP 192.168.6.109 CentOS7.2 Mysql5.6-34 mysql-mmm2.2.1-15

mysql+amoeba+mysqlmmm高可用群集

一.MySQL-MMM(Master-Master replication manager fo MySQL) MMM概述 双主故障切换和日常管理的程序 由多个mysql主服务器和多个mysql从服务器组成 MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制 其内部附加的工具脚本也可以实现多个slave的read负载均衡. 注: 同一时刻只允许一个主进行写入,额外主提供部分读的服务 不适用于要求数据一致性很高的场合(可替换产品为:Heartbeat+

Amoeba变形虫

我们通过路由选择来决定操作时访问那个数据库,而路由的选择方式不外乎以下几种: 1) SpringAOP方式:spring底层配置多个数据源,配置路由(面向切面编程)手工写很多代码(废除) 2) MySql proxy编程lua(脚本语言)(几乎没人直接使用) 3) Amoeba国人基于mysql proxy.不用编程,配置两个xml文件即可,对程序没有侵入性. 4) MyCat阿里,基于mysqlProxy 这里主要应用Amoeba. Amoeba读写分离,通过配置xml文件来声明有几个数据库服

SPOJ 705 Distinct Substrings(后缀数组)

[题目链接] http://www.spoj.com/problems/SUBST1/ [题目大意] 给出一个串,求出不相同的子串的个数. [题解] 对原串做一遍后缀数组,按照后缀的名次进行遍历, 每个后缀对答案的贡献为n-sa[i]+1-h[i], 因为排名相邻的后缀一定是公共前缀最长的, 那么就可以有效地通过LCP去除重复计算的子串. [代码] #include <cstdio> #include <cstring> #include <algorithm> usi

python中super出现的TypeError: must be type, not classobj 原因及解决

执行一下代码,出现错误,TypeError: must be type, not classobj class A():    def __init__(self):        print("Enter A")        print("Leave A") class B(A):    def __init__(self):        print("Enter B")        super(B, self).__init__()  

SPOJ 3273

传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 1 //SPOJ 3273 2 //by Cydiater 3 //2016.8.31 4 #include <iostream> 5 #include <cstring> 6 #include <ctime> 7 #include <cmath> 8 #include <cstdlib> 9 #include <string> 10 #include

python中的super

super用于类的继承.用super()代替父类名 (一)通过类名调用父类中的方法                                                         (二)通过super调用父类中的方法(python3) 结果如下: python3中的写法:super().__init__() python2中的写法:super(B,self).__init__()  B子类,不是父类,别写错了.