列表

详情


NC25856. 跳跃的旋律

描述

题目背景

ssy最可爱了!我会爱你3000遍的
                    ——水宝宝

题目描述

空中有几颗星星,水宝宝正在仰望着,幻想着与ssy......

为了省事,我们把天空看成一条从1开始的长度为n的数轴,数轴上的每个整数点

都有一个值,表示这个点的星星的数量,现在,水宝宝为了给ssy一个惊喜,想知道对于给定的x,y,

是多少呢? (x+ky<=n)(k>=0)

为了防止数字太大,你需要把答案mod 20180718



注:本系列题不按难度排序哦

输入描述

第一行一个数表示n,询问次数m

接下来一行n个数,表示数轴上每个点星星的数量

接下来m行,每行一个x,y,表示询问

输出描述

m行,对于每一组x,y,输出 (x+ky<=n)(k>=0)

示例1

输入:

6 3
3 5 7 4 6 8
1 3
2 4
1 1

输出:

12
40
20160

说明:

样例解释:第一组数据,答案为a[1]*a[1+3]=12

第二组数据,答案为a[2]*a[2+4]=a[2]*a[6]=5*8=40

第三组数据有更好的解法,可惜这里空间太小,写不下了QAQ

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 715ms, 内存消耗: 26448K, 提交时间: 2022-11-21 22:24:12

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N = 5e5 + 100;
const int mod = 20180718;
ll ans[N], s[N];

struct node {
	int l, r, id;
	bool operator<(const node &M) const {
		return r < M.r;
	}
} p[N];
ll a[N];

int main() {
	ios::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	int cnt = 0;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		if (y >= 600) {
			ans[i] = 1;
			for (int j = x; j <= n; j += y)
				ans[i] = ans[i] * a[j] % mod;
		} else
			p[++cnt] = {x, y, i};
	}
	sort(p + 1, p + 1 + cnt);
	for (int i = 1; i <= cnt; i++) {
		if (p[i].r != p[i - 1].r) {
			int j;
			for (j = n; j >= n - p[i].r + 1; j--)
				s[j] = a[j];
			for (; j; j--)
				s[j] = s[j + p[i].r] * a[j] % mod;
		}
		ans[p[i].id] = s[p[i].l];
	}
	for (int i = 1; i <= m; i++)
		cout << ans[i] << '\n';
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 242ms, 内存消耗: 8196K, 提交时间: 2019-06-14 21:34:31

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rg register
inline int read(){
	rg char ch=getchar();
	rg int x=0,f=0;
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
int a[500050],n,m;
const int mod=20180718;
signed main(){
	n=read(),m=read();
	for(rg int i=1;i<=n;++i) a[i]=read();
	for(int x,y,k,i=1;i<=m;++i){
		x=read(),y=read();k=(n-x)/y;
		long long ans=1;
		for(int i=0;i<=k;++i) ans=(ans*a[x+i*y])%mod;
		printf("%lld\n",ans);
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 482ms, 内存消耗: 18128K, 提交时间: 2019-06-14 22:55:38

#include<cstdio>
#define ll long long 
#define mod 20180718
#define maxn 600005
ll a[maxn];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        a[i]=a[i]%mod;
    }
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        ll ans=a[x]%mod;
        for(int j=1;x+j*y<=n;j++){
            ans=ans*a[x+j*y]%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

上一题