题目大意:

由1开始不断往数组中添加数

就是按照当前所在位置所在的数表示的个数添加这个数目的数

1 2 2 3 3 后面因为要填4,而4号位置为3,说明之后要填3个4

问题就是给定一个n,找到n出现的最后位置p,再找p出现的最后位置即可

这里可以考虑先找到g[i]表示 i 连续出现了多少次

这里想一下的话,因为g[i] 相当于 i 位置出现的数

所以g[i]也满足这个序列

令f[i] 表示 i 出现的最后位置,也就是1~i的总个数

后面去计算g[i]的时候就可以考虑的是找到第 i 个位置在那个f[]的区间内  , 如果f[k-1]< i <= f[k]

那么说明此时 g[i] = k

那么就可以logn的复杂度计算g[n]了

要计算最后的答案,要考虑的是,给定的n,找到最后出现的p,中间长度 p = g[1]+g[2]....+g[p]

然后再找对应的ans ,那么每次增加的g[i],就会让整个序列 的长度增加 i*g[i]

i*g[i] 可以理解为的是,长度为i的数量有g[i]个, 所以总长度是i*g[i]

所以ans = sigma(i*g[i]) i<=n

那么对于n <= 1e9

那么大致计算一下会发现f[500000]>1e9

所以g[n]<500000只要暴力求出前500000的g[] , f[]

那么答案计算前,先找到g[n]是多少

g[n]= lower_bound(f+1 , f+N+1 , n)-f

然后说明[1 , g[n]-1]这一段区间内的所有长度都被用到了

所以之前预处理这个长度的前缀和 sum[]

对于每一个长度 i ,他出现的次数都是 f[i]-f[i-1]

sigma(n*g[n]) f[i-1]<n<=f[i]  -> g[n] = i

那么答案就是 i*等差数列了,记得取模(⊙o⊙)哦

然后(g[n]-1 , g[n]]这一段只要枚举 (g[n]-1 , n] 就可以了

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define M 26
#define N 500000
#define ull unsigned long long
#define ll long long
const int MOD = ;
int f[N+] , g[N+] , cnt[N+];
ll sum[N+]; int Hash(int v)
{
return lower_bound(f+ , f+N+ , v)-f;
} void init()
{
g[] = , f[] = ;
g[] = , f[] = ;
for(int i= ; i<=N ; i++){
g[i] = lower_bound(f+ , f+i , i)-f;
f[i] = f[i-]+g[i];
}
// for(int i=1 ;i<=100 ; i++)
// cout<<i<<" "<<g[i]<<" "<<f[i]<<endl;
// cout<<f[N]<<endl; sum[] = ;
for(int i= ; i<=N ; i++){
sum[i] = sum[i-]+(ll)(f[i-]++f[i])*(f[i]-f[i-])/ % MOD * (ll)i % MOD;
// if(i<=10) cout<<"sum: "<<i<<" "<<sum[i]<<endl;
}
}
int main() {
// freopen("a.in" , "r" , stdin);
// freopen("out.txt" , "w" , stdout); init();
int T , n;
scanf("%d" , &T);
while(T--){
scanf("%d" , &n);
int pos = Hash(n);
ll ret = sum[pos-];
for(int i=f[pos-]+ ; i<=n ; i++) //这个区间每个长度都为pos
{
ret = (ret+(ll)i*pos)%MOD;
}
printf("%I64d\n" , ret);
}
return ;
}

HDU 5439 Aggregated Counting的更多相关文章

  1. Hdu 5439 Aggregated Counting (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online 找规律)

    题目链接: Hdu 5439 Aggregated Counting 题目描述: 刚开始给一个1,序列a是由a[i]个i组成,最后1就变成了1,2,2,3,3,4,4,4,5,5,5.......,最 ...

  2. Aggregated Counting(找规律 + 预处理)

    Aggregated Counting 转 : https://blog.csdn.net/cq_phqg/article/details/48417111 题解: 可以令n=1+2+2+3+3+.. ...

  3. [HDOJ5439]Aggregated Counting(乱搞)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5439 题意:按规则构造一个数列a a(1)=1 a(2)=2 a(2)=2 -------> 写两个 ...

  4. HDU 4358 Boring counting(莫队+DFS序+离散化)

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  5. 后缀数组 --- HDU 3518 Boring counting

    Boring counting Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...

  6. HDU 3518 Boring counting

    题目:Boring counting 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3518 题意:给一个字符串,问有多少子串出现过两次以上,重叠不能算两次 ...

  7. HDU - 4358 Boring counting (dsu on tree)

    Boring counting: http://acm.hdu.edu.cn/showproblem.php?pid=4358 题意: 求一棵树上,每个节点的子节点中,同一颜色出现k次 的 个数. 思 ...

  8. hdu 4358 Boring counting dfs序+莫队+离散化

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  9. HDU 3887:Counting Offspring(DFS序+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...

随机推荐

  1. iOS之UIImagePickerController的应用

    直接代码敬之 @import MobileCoreServices; @import AVFoundation; <UIImagePickerControllerDelegate,UINavig ...

  2. iframe页面调用父窗口JS函数

    A页面iframe 页面B, 此时 如果要在B页面调用父页面A的函数 B页面写法 parent.functionName(); 错误1: 解决办法 var js_domain_async = 'bai ...

  3. 养成好的JAVA编码习惯

    原文:http://blog.csdn.net/lifuxiangcaohui/article/details/25231027 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下 ...

  4. easyui combobox 智能提示搜索

    <!-- 获取机会点名称列表 --><script> function initOpportunityNameFuzzyQuery() { $('#jihuidianmingc ...

  5. toolbar

    toolbar= (Toolbar) findViewById(R.id.toolbar_mainactivity); // 设置主标题及其颜色 toolbar.setTitle("Andr ...

  6. Element can be click when out of view

    WebDriver can't action the element when out of view Webdriver can't action the element when the elem ...

  7. WebDriver - 添加失败截图

    WebDriver失败截图可以通过两种方式实现: 1. Use WebdriverEventListener 第一步:创建自己的WebDriverEventListener 创建自己的WebDrive ...

  8. 美国半个互联网瘫痪对开发者使用DNS的启发

    版权声明:本文由腾讯云DNSPod团队原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/174 来源:腾云阁 https:// ...

  9. English substitute

    英语写作中替换掉用到发腻的↓常用词↓,吐血整理2小时~~   动词替换:   1.Improve 提高:   Promote: 促进AC之间的贸易 promote the trade between ...

  10. Android要点记录

    1.Toolbar不能上滑隐藏的原因<!--如果在CoordinatorLayout加上android:fitsSystemWindows="true",而不是在AppLay ...