题意:给定$n=\prod\limits_{i=1}^mp_i^{a_i}$,求$\varphi\left(\cdots\varphi\left(n\right)\cdots\right)$(有$k$个$\varphi$)

因为$\varphi(n)=n\prod\limits_{i=1}^m\dfrac{1-p_i}{p_i}$,所以每次对一个数$n$取$\varphi$,就相当于对它的每个质因数$p$,把$n$乘上$\dfrac{p-1}p$

先筛出$10^6$内的质数,然后对$n$的每一个的质因子分别考虑

记$c_p$为当前$n$的质因数分解式中$p$的指数,$k_p$为还要对$p$这个指数执行多少次$\varphi$,每次比较$c$和$k$,可以一次执行$t=\min(c_p,k_p)$次$\varphi$(一次砍掉$t$个$p$),再把$(p-1)^t$的质因数分解加到对应的$c$即可

这样做会带来一个问题:我们执行$\varphi$时必须要用$n$的质因子$p$,而用到的$p$可能来自最近的几次质因数分解$p-1$,而这几次分解并未完全分解,所以我们对于某些执行$\varphi$多次的$p$要暂缓执行(等待之前的$p-1$被分解完),记$skip_p$表示对于$p$要跳过多少次执行$\varphi$,每次如果可以执行,那么就用$t-1$更新$skip_p$(执行完这次,还要等待$t-1$波分解其他质因子就可以继续了),否则按$skip_p$跳过几次,这样可以保证每次执行$\varphi$都优先使用原来的$p$,最后再把$p-1$分解留到以后使用

数据范围很吓人,可是这样是挺快的2333(因为如果要执行$\varphi$一次就是$\min(c_p,k_p)$,所以这两个数都减小得很快)

2018.3.28补充一些东西

$\varphi\left(\prod\limits_{i=1}^kp_i^{a_i}\right)=\prod\limits_{i=1}^k\varphi\left(p_i^{a_i}\right)=\prod\limits_{i=1}^kp_i^{a_i-1}\left(p_i-1\right)$

第一次取$\varphi$,我们可以对每个质因数分开考虑,之后的取$\varphi$操作就要小心了,如果我们对原来的$p_i$执行$\varphi$,由此产生的$p_i-1$分解之后会加到更小的$p_i$上

所以,①我们要从小到大枚举$p_i$做$\varphi$操作(因为$p_i-1$分解成更小的质数)②一次性对$p_i$做完$t$次$\varphi$之后,接下来如果当前没有$p_i$这个因子,我们要跳过这些操作(总共跳过$t-1$次)而不是直接把$k_{p_i}-1$(因为接下来同一阶段的其他的$p_i-1$分解之后有可能落到这里,我们不能忽略掉这些“新来的”$p_i$)

#include<stdio.h>
typedef long long ll;
const int T=1000000;
int p[1000010],f[1000010];
ll c[1000010],k[1000010],skip[1000010];
ll min(ll a,ll b){return a<b?a:b;}
int main(){
	int m,M,i,j,x;
	ll t;
	bool flag;
	for(i=2;i<=T;i++){
		if(f[i]==0){
			M++;
			p[M]=i;
			f[i]=i;
		}
		for(j=1;p[j]<=f[i]&&p[j]*i<=T&&j<=T;j++)f[p[j]*i]=p[j];
	}
	scanf("%d",&m);
	while(m--){
		scanf("%d",&x);
		scanf("%I64d",c+x);
	}
	scanf("%I64d",&t);
	for(i=1;i<=T;i++)k[p[i]]=t;
	do{
		flag=0;
		for(i=1;i<=T;i++){
			x=p[i];
			if(c[x]){
				if(k[x]==0)continue;
				t=min(c[x],k[x]);
				c[x]-=t;
				k[x]-=t;
				skip[x]+=t-1;
				flag=1;
				x--;
				while(x>1){
					c[f[x]]+=t;
					x/=f[x];
				}
			}else if(skip[x])
				skip[x]--;
			else if(k[x])
				k[x]--;
		}
	}while(flag);
	x=0;
	for(i=1;i<=T;i++){
		if(c[p[i]])x++;
	}
	printf("%d\n",x);
	for(i=1;i<=T;i++){
		if(c[p[i]])printf("%d %I64d\n",p[i],c[p[i]]);
	}
}

[CF396E]On Iteration of One Well-Known Function的更多相关文章

  1. Openfire Strophe开发中文乱码问题

    网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题  一直没调试成功  估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...

  2. python3.4 build in functions from 官方文档 翻译中

    2. Built-in Functions https://docs.python.org/3.4/library/functions.html?highlight=file The Python i ...

  3. python3 入门 (三) 函数与lambda表达式、闭包

    函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...

  4. zw版_Halcon图像库delphi接口文件

    zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下.     参见:& ...

  5. A Neural Network in 11 lines of Python

    A Neural Network in 11 lines of Python A bare bones neural network implementation to describe the in ...

  6. Python2.7笔记——常用技术点汇总

    目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...

  7. 内置函数 -- filter 和 map

    参考地址:http://www.cnblogs.com/sesshoumaru/p/6000788.html 英文文档: filter(function, iterable) Construct an ...

  8. CSS3动画以及animation事件

    1.CSS3动画以及animation事件的定义 animation :name duration timing-function delay iteration-count direction an ...

  9. Python内置函数(34)——filter

    英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...

随机推荐

  1. at用法小记

    By francis_hao    Aug 22,2017   at – 设置稍后执行的作业. 概要 at [-V] [-f file] [-mMlv] timespec...at [-V] [-f ...

  2. LA2995 Image is everything

    蓝书P12 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm ...

  3. bzoj 2525 [Poi2011]Dynamite 二分+树形dp

    [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 270  Solved: 138[Submit][Status][D ...

  4. Windows下安装Mycat-web

    Mycat-web是基于Mycat的一个性能监控工具,如:sql性能监控等. 在安装Mycat-web之前需要先安装Zookeeper: 可参考: http://blog.csdn.net/tlk20 ...

  5. BigDecimal精度问题

    介绍 1.商业计算使用BigDecimal. 2.使用参数为String的构造函数. 3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象.所以在做加减乘除后千万要保存操作后的值 ...

  6. Spring学习之路——单例模式和多例模式

    在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实 ...

  7. MINA 网络黏包处理代码

    本文完整代码,可以浏览: https://github.com/hjj2017/xgame-code_server/blob/master/game_server/src/com/game/gameS ...

  8. 【洛谷 P2480】 [SDOI2010]古代猪文(中国剩余定理,Lucas定理)

    题目链接 这题出的有点nb,PKU: Pig Kingdom University , NOIP: National Olympics in Informatic of Pigs... 题意:求\(G ...

  9. 2017年上海金马五校程序设计竞赛:Problem I : Frog's Jumping (找规律)

    Description There are n lotus leaves floating like a ring on the lake, which are numbered 0, 1, ..., ...

  10. UVa 12265 贩卖土地 单调栈

    题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之 ...