翻转数列

问:小Q定义了一种数列称为翻转数列:给定整数n、m,满足n能被2m整除,对于一串连续递增的整数数列1、2、3、4、5…,每隔m个符号翻转一次,最初的符号为‘-’,例如n=8,m=2,数列则为:-1,-2,+3,+4,-5,-6,+7,+8。
而n=4,m=1,数列则为:-1,+2,-3,+4。小Q现在希望你能帮他算算前n项和为多少。

#include<stdio.h>
#include<assert.h>
int main()
{
	int n,m;
	int sum = 0;
	int flg = -1;
	scanf ("%d %d",&n,&m);
	assert(n%(2*m)==0);
	for(int i=1;i<=n;i++)
	{
		sum += flg*i;
		if(i%m==0)
		{
			flg*= -1;
		}
		printf("%d\n",sum);
	}
}

此方法时间复杂度太大通过率只有30%

int main()
{
	int n,m;
	scanf ("%d %d",&n,&m);
	assert(n%(2*m)==0);
	printf("%d\n",m*(n/2));
    return 0;
}

本次测试用例未通过,通过率为30%
测试用例:323445962 371
对应输出应该为:59999225951
你的输出为:-130316193

int main()
{
	unsigned long long n,m;
	scanf ("%lld %lld",&n,&m);
	assert(n%(2*m)==0);
	printf("%lld\n",m*(n/2));
    return 0;
}

成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值