题目描述

定义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

输入输出样例

输入样例#1:

2 1 5
输出样例#1:

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]数位平方和的更多相关文章

  1. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  2. Happy Number - LeetCode

    examination questions Write an algorithm to determine if a number is "happy". A happy numb ...

  3. 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 ...

  4. [luogu3413]萌数

    [luogu3413]萌数 luogu 考虑数位dp 怎么判断一个数是不是萌数? 只要知道其中某一位和它的前一位相等或者和前一位的前一位相等,那么它就是一个萌数 什么样的数不是萌数? 对于它的每一位都 ...

  5. Java判断一个数是不是快乐数

    快乐数的定义: 快乐数(happy number)有以下的特性: 在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必为1. 以十进制为 ...

  6. LeetCode(202) Happy Number

    题目 Write an algorithm to determine if a number is "happy". A happy number is a number defi ...

  7. LeetCode 202: 快乐数 Happy Number

    题目: 编写一个算法来判断一个数是不是 "快乐数". 一个 "快乐数" 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直 ...

  8. 清明 DAY 3

    ans=1000*4 分别固定千位,百位,十位,个位为1,其余位置随便排 对于每一个质因数的n次方,共有n+1中选择方法,即这个质因数的0~n次方 故共有   4*3*5=60  种方法 (1)取两册 ...

  9. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

随机推荐

  1. Spring MVC配置详解(3)

    一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.ja ...

  2. JavaScript权威指南读书笔记【第一章】

    第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...

  3. 【原】spring jar 下载

    作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/8098965.html 1.进入官网 ...

  4. 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 ...

  5. 图像滤波与OpenCV中的图像平滑处理

    .About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...

  6. Springboot ResponseEntity IE无法正常下载文件

    项目在google浏览器下都很nice了,但当测试到IE的时候开始出现各种问题. 项目是前端js通过URL传参fileName到后台解析返回ResponseEntity 前端代码如下: window. ...

  7. Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)

    解决办法,json数据只能用双引号,而不能用单引号

  8. Qt5编译项目出现GL/gl.h:No such file or directory错误

    编译在Ubuntu12.04下安装了Qt5.1.1,在编译工程的时候出现了如下错误:“GL/gl.h:No such file or directory”,查了一下资料发现这个问题由于系统中没有安装O ...

  9. Dropout和学习率衰减

         Dropout 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象.在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上 ...

  10. ProtoBuf练习(二)

    重复数据类型 protobuf语言的重复字段类型相当于C++的std::list数据类型 工程目录结构 $ ls proto/ TServer.proto TSession.proto proto文件 ...