[luogu 1660]数位平方和
题目描述
定义S(n)表示n的各个数位的k次方的和。定义$H(n)=min{n,S(n),H(S(n))}$。
求$$\sum _{i=A} ^{B} {H(i)} \mod 10000007$$
输入输出格式
输入格式:
一行三个数K、A、B。
【数据规模】
对于20%的数据,满足1≤A、B≤50;
对于100%的数据,满足1≤A、B≤10^6,K≤6.
输出格式:
B 一个数∑H(i) mod 10000007
i=A
输入输出样例
2 1 5
14
题解:
很暴力的解法,把每一个数都看作一个点,那么我们可以从一个数的每一位来得到它的下一个数,并向下一个数连一条有向边。
这样我们就得到了一个有向有环图,那么题意就变成了从一个点开始,一直向下走,所经过的所有点的最小值(包括环)。
考虑tarjan缩点,统计一下每一个强连通分量(也就是环)上的最小值。
很显然环上是没有出边的,我们将所有边反向,从入度为0的分量开始拓扑,一路上不断更新路径上的最小值,那么这样就统计出来了每一个点一直向下走,所经过的所有点的最小值。
然后把题目要求的点加在一起输出就可以了。(我用的是前缀和)
另外不要怀疑这道题会因为点过多而超时,当k=6时,以1~100000分别为起点,所经过的数的最大值是3188...(反正是个七位数),还是可以承受的。
时空复杂度O(能过)
//Never forget why you start
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#define mod (10000007)
using namespace std;
int n,t[];
bool vis[];
int suan(int x){
int ans=;
while(x){
ans+=t[x%];
x/=;
}
return ans;
}
int to[];
void dfs(int r){
if(vis[r])return;
vis[r]=;
int Next=suan(r);
to[r]=Next;
dfs(Next);
}
int dfn[],low[],sccno[],scc,dfscnt,mmin[];
int s[],top;
void tarjan(int r){
dfn[r]=low[r]=++dfscnt;
s[++top]=r;
int y=to[r];
if(!dfn[y]){
tarjan(y);
low[r]=min(low[r],low[y]);
}
else if(!sccno[y])low[r]=min(low[r],dfn[y]);
if(low[r]==dfn[r]){
scc++;
int x;
while(){
x=s[top--];
sccno[x]=scc;
mmin[scc]=min(x,mmin[scc]);
if(x==r)break;
}
}
}
struct node{
int next,to;
}edge[];
int size=;
void putin(int from,int to){
size++;
edge[size].to=to;
edge[size].next=dfn[from];
dfn[from]=size;
}
void bfs(){
queue<int>mem;
for(int i=;i<=scc;i++)if(!s[i])mem.push(i);
while(!mem.empty()){
int x=mem.front();mem.pop();
for(int i=dfn[x];i!=-;i=edge[i].next){
int y=edge[i].to;
mmin[y]=min(mmin[y],mmin[x]);
s[y]--;
if(!s[y])mem.push(y);
}
}
}
int main(){
int i,j;
scanf("%d",&n);
memset(mmin,/,sizeof(mmin));
for(i=;i<=;i++)t[i]=pow(i,n);
for(i=;i<=;i++){
dfs(i);
}
for(i=;i<=;i++)
if(!dfn[i])tarjan(i);
memset(dfn,-,sizeof(dfn));
memset(s,,sizeof(s));
for(i=;i<=;i++)
if(sccno[i]!=sccno[to[i]])putin(sccno[to[i]],sccno[i]),s[sccno[i]]++;
bfs();
low[]=;
for(i=;i<=;i++){
low[i]=mmin[sccno[i]];
(low[i]+=low[i-])%=mod;
}
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",(low[r]-low[l-]+mod)%mod);
return ;
}
[luogu 1660]数位平方和的更多相关文章
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- Happy Number - LeetCode
examination questions Write an algorithm to determine if a number is "happy". A happy numb ...
- Project Euler 92:Square digit chains C++
A number chain is created by continuously adding the square of the digits in a number to form a new ...
- [luogu3413]萌数
[luogu3413]萌数 luogu 考虑数位dp 怎么判断一个数是不是萌数? 只要知道其中某一位和它的前一位相等或者和前一位的前一位相等,那么它就是一个萌数 什么样的数不是萌数? 对于它的每一位都 ...
- Java判断一个数是不是快乐数
快乐数的定义: 快乐数(happy number)有以下的特性: 在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必为1. 以十进制为 ...
- LeetCode(202) Happy Number
题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...
- LeetCode 202: 快乐数 Happy Number
题目: 编写一个算法来判断一个数是不是 "快乐数". 一个 "快乐数" 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直 ...
- 清明 DAY 3
ans=1000*4 分别固定千位,百位,十位,个位为1,其余位置随便排 对于每一个质因数的n次方,共有n+1中选择方法,即这个质因数的0~n次方 故共有 4*3*5=60 种方法 (1)取两册 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
随机推荐
- Spring MVC配置详解(3)
一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.ja ...
- JavaScript权威指南读书笔记【第一章】
第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...
- 【原】spring jar 下载
作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/8098965.html 1.进入官网 ...
- hadoop mapreduce 计算平均气温的代码,绝对原创
1901 46 1902 21 1903 48 1904 33 1905 43 1906 47 1907 31 1908 28 1909 26 1910 35 1911 30 1912 16 1913 ...
- 图像滤波与OpenCV中的图像平滑处理
.About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...
- Springboot ResponseEntity IE无法正常下载文件
项目在google浏览器下都很nice了,但当测试到IE的时候开始出现各种问题. 项目是前端js通过URL传参fileName到后台解析返回ResponseEntity 前端代码如下: window. ...
- Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)
解决办法,json数据只能用双引号,而不能用单引号
- Qt5编译项目出现GL/gl.h:No such file or directory错误
编译在Ubuntu12.04下安装了Qt5.1.1,在编译工程的时候出现了如下错误:“GL/gl.h:No such file or directory”,查了一下资料发现这个问题由于系统中没有安装O ...
- Dropout和学习率衰减
Dropout 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象.在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上 ...
- ProtoBuf练习(二)
重复数据类型 protobuf语言的重复字段类型相当于C++的std::list数据类型 工程目录结构 $ ls proto/ TServer.proto TSession.proto proto文件 ...