[CF396E]On Iteration of One Well-Known Function
题意:给定$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的更多相关文章
- Openfire Strophe开发中文乱码问题
网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题 一直没调试成功 估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...
- python3.4 build in functions from 官方文档 翻译中
2. Built-in Functions https://docs.python.org/3.4/library/functions.html?highlight=file The Python i ...
- python3 入门 (三) 函数与lambda表达式、闭包
函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...
- zw版_Halcon图像库delphi接口文件
zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下. 参见:& ...
- 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 ...
- Python2.7笔记——常用技术点汇总
目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...
- 内置函数 -- filter 和 map
参考地址:http://www.cnblogs.com/sesshoumaru/p/6000788.html 英文文档: filter(function, iterable) Construct an ...
- CSS3动画以及animation事件
1.CSS3动画以及animation事件的定义 animation :name duration timing-function delay iteration-count direction an ...
- Python内置函数(34)——filter
英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...
随机推荐
- rsync安装使用详解
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.它的特性如下: 可以镜像保存整个目录树和文件系统. 可以很容易做到保持原来文件的权限.时间.软硬 ...
- CodeSmith和PowerDesigner (转)
首先,既然要讲解如何使用CodeSmith和PowerDesigner快速生成批量代码,当然要先安装这2个软件啦,下面就简单说说如何安装破解这2款软件吧,当然破解只是学习之用,请大家不要用于商业用途哈 ...
- MyBatis的SQL语句映射文件详解(二)----增删改查
1.select语句 public List<User> findUser() { // TODO Auto-generated method stub List users= ( ...
- Spring 学习笔记(三)之注解
一.在classpath下扫描组件 •组件扫描(component scanning): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件. •特定组件包括: ...
- HDU2177取(2堆)石子游戏---(威佐夫博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2177 取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) M ...
- 全排列---(dfs)
全排列输入一个数n,按字典序输出1-n的全排列 #include "cstdio" #include "cstring" ],ans[],n; void dfs ...
- 转: Photoshop cs6 快捷键命令大全
转自: http://www.cnblogs.com/zhen656/p/4249759.html 工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取) 矩形.椭圆选框工具.单行单列 ...
- linux知识复习1-dup dup2
#include <sys/stat.h> #include <string.h> #include <fcntl.h> #include <stdio.h& ...
- 程序员面试宝典 笔记(第六章 预处理 const 和sizeof())
void main() { "; cout<< cout<< "; cout<< cout<<strlen(ss2)<< ...
- CHM文件出现的常见错误及解决办法
一.chm文件内容乱码: 解决方式:将IE浏览器的编码换成自动选择,或者选择UTF-8和GBK看那个能使用.因为chm文件默认的是IE浏览器的内核. 二.easy chm软件编译文件时左侧索引乱码,源 ...