Aggregated Counting(找规律 + 预处理)

Aggregated Counting

转 : https://blog.csdn.net/cq_phqg/article/details/48417111

题解:

可以令n=1+2+2+3+3+......+ i    这个序列的长度为p

那么a[n]=1*1+2*2+3*2+...... + p*i

那么不难发现a[a[n]] = 1*1 + (2+3)*2 + (4+5)*3 + (6+7+8)*4 + ... + (pre+1 + pre+2 + ... + pre+b[p] ) * p

b[p]为p在原序列中出现的次数

pre,b[p]这些值都可以预处理算出   每次询问可以O(1)算出答案

pre 是 第p-1项的pre + b[p-1]

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;
const int MOD = (int)1e9+7;
const int INF = (int)1e9;
const int MAXN = 438744;
int a[MAXN+5];
int b[MAXN+5];
int sum[MAXN+5];
int dp[MAXN+5];
int pre[MAXN+5];
int sz,val;

int add(int x,int y){
    x+=y;
    if(x>=MOD)x-=MOD;
    return x;
}

int po(int x,int n){
    int ans=1;
    int temp=x;
    while(n){
        if(n&1)ans=(ll)ans*temp%MOD;
        temp=(ll)temp*temp%MOD;
        n>>=1;
    }
    return ans;
}

int main()
{
    val=po(2,MOD-2);
    a[1]=1;
    a[2]=2;
    a[3]=2;
    int sz=3;
    for(int i=3;;i++){
        int cnt=a[i];
        while(cnt){
        a[++sz]=i;
        cnt--;
        if(sz>=MAXN)break;
        }
        if(sz>=MAXN)break;
    }
    for(int i=1;i<=MAXN;i++){
        sum[i]=sum[i-1]+a[i];
        if(sum[i]>=INF)break;
    }

    for(int i=1;i<=MAXN;i++){
        dp[i]=add(dp[i-1],(ll)( add(add(add(pre[i-1],1),pre[i-1]),a[i]) )*a[i]%MOD*i%MOD*val%MOD);
        pre[i]=add(pre[i-1],a[i]);
    }

    int t;scanf("%d",&t);
    while(t--){
        int n;scanf("%d",&n);
        int l=1,r=MAXN;
        int pos;
        while(l<=r){
            int mid=l+r>>1;
            if(n<=sum[mid]){
                pos=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        int x=n-sum[pos-1];
        int ans=add(dp[pos-1],(ll)( add(add(add(pre[pos-1],1),pre[pos-1]),x) )*x%MOD*pos%MOD*val%MOD);
        printf("%d\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/mrh-acmer/p/9459484.html

时间: 2024-11-08 23:46:38

Aggregated Counting(找规律 + 预处理)的相关文章

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.......,最后问a[i]==n(i最大)时候,i最后一次出现的下标是多少? 解题思路: 问题可以转化为求a[i] == n (i最大),数列前i项的和为多少. index: 1 2 3 4 5 6 7 8 9 10 a:        1 2 2 3 3 4 4 4 5 5 可以观察出:ans[1] = 1,

【模拟题(63550802...)】解题报告【贪心】【拓扑排序】【找规律】【树相关】

目录: 1.A[树相关]    2.B[找规律]    3.C[贪心][拓扑排序] A. 描述(A 输入文件 : A.input 输出文件 : A.output)一个城市的构成是一颗n 个节点的树(2 ≤ n ≤ 200), 现在需要在树中找出两条不相交的路径(即两条路径不能有重边也不能有重点),使得路径的长度的乘积最大.输入描述第一行一个数n 表示这个城市一共有 n 个节点.接下来 n-1 行,每行两个数ai 和bi (1 ≤ ai,bi ≤ n ),分别表示从ai 到bi,有一条边,每条边的

hdu_5894_hannnnah_j’s Biological Test(打表找规律)

题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律,最后发现答案为n*C(n-m*k-1,n-m*k-m)/m 然后这里求组合要预处理一下,逆元也预处理一下 最后还要特判m为1的情况 1 #include<cstdio> 2 typedef long long ll; 3 const int P=1e9+7; 4 5 const int maxn

HDU 4349 Xiao Ming&#39;s Hope 找规律

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4349 Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1723    Accepted Submission(s): 1144 Problem Description Xiao Ming likes coun

hdu4952Number Transformation (找规律)

Number Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 76 Accepted Submission(s): 28 Problem Description Teacher Mai has an integer x. He does the following operations k times. In t

hdu4952 Number Transformation(数学题 | 找规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4952 Number Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 261    Accepted Submission(s): 117 Problem Description Teacher Mai has

Codeforces 837E Vasya&#39;s Function 数论 找规律

题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b).给定 x 和 y (<=1e12)求F(x,y). 题解:a=A*GCD(a,b) b=B*GCD(a,b),那么b-GCD(a,b) = (B-1)*GCD(a,b),如果此时A和B-1依然互质,那么GCD不变下一次还是要执行b-GCD(a,b).那么GCD什么时候才会变化呢?就是说找到一个最小的S,使得(B-S)%T=0其中T是a的任意一个因子.变形得到:B%T=S于是我们知道S=min(B%T).也

HDOJ 题目4349 Xiao Ming&#39;s Hope(找规律)

Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1515    Accepted Submission(s): 1015 Problem Description Xiao Ming likes counting numbers very much, especially he is fond of co

uva10706 - Number Sequence(找规律)

题目:uva10706 - Number Sequence(找规律) 题目大意:有这样一串序列11212312341234512345612345671234567812345678912345678910123456789101112345678910...,问第i个位置数的值. 1  2     3       4          5            6              7               ... 解题思路:这题需要发现规律.我一开始还看错题意了.规律是看了别人