题目描述

定义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. 启动新内核出现:No filesystem could mount root, tried: ext3 ext2 cramfs vfa

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/51841791 下载新编译的内核出现:No filesystem could mou ...

  2. BluetoothFindRadioClose 函数

    BOOL BluetoothFindRadioClose( HBLUETOOTH_RADIO_FIND hFind );关闭与查找蓝牙无线电相关的枚举句柄.参数: hFind Enumeration ...

  3. 菜鸟攻城狮1(JAVA程序设计)

    1.JAVA是一个完整的平台,有一个庞大的库,提供了可重复利用的代码功能块,安全性,跨操作系统的可以移植性,自动垃圾回收机制 2.JAVA设计者白皮书:简单性.面向对象.网络技能.健壮性.安全性.体系 ...

  4. List for game to play latter

    1.The Elder Scrolls V 2.Border Lands 1,2 3.Mind Killer 4.Dark Soul 2 5.Watch Dog 6.Valkyria Chronicl ...

  5. cocos2dx之lua绑定简析

    一.总原则:c++对象的生命期不依赖lua gc管理,手动创建的对象要手动销毁 二.引擎层在设计上就是支持脚本概念的(也就是说脚本的使用是“侵入式”的),与lua打交道的代码都封在CCLuaEngin ...

  6. hdu1078

    #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; i ...

  7. 【idea-部署web项目】

    IntelliJ IDEA 14.x 与 Tomcat 集成,并运行Web项目 时间 2015-01-17 09:40:06  PHP博客 原文  http://blog.snsgou.com/pos ...

  8. Mathematics Base - 期望、方差、协方差、相关系数总结

    参考:<深度学习500问> 期望 ​在概率论和统计学中,数学期望(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和.它反映随机变量平均取值的大小. 线性运算: \(E(ax+ ...

  9. BZOJ 1858【线段树】

    题意:  0 a b 把 [a, b] 区间内的所有数全变成0  1 a b 把 [a, b] 区间内的所有数全变成1  2 a b 把 [a,b] 区间内的所有数全部取反  3 a b 询问 [a, ...

  10. 51nod 1154【DP】

    区间DP大暴力吧?GG. dp[ i ] 为字符至 i 的最少数量. 如果[Left , Right]是回文串, dp[Right] = min(dp[ Right ] , dp[Left-1] + ...