ARC102 C~D

C:
枚举中间点,计算两边点差值,把个数乘起来即可

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200005;
long long n,k,ans;
int main()
{
	scanf("%lld%lld",&n,&k);
	for(long long i=1;i<=n;i++)
		if(2*(abs(k-i)%k)%k==0)
			ans+=1ll*((n-(abs(k-i)%k))/k+(abs(k-i)%k!=0))*((n-(abs(k-i)%k))/k+(abs(k-i)%k!=0));//,cerr<<i<<" "<<(n-(abs(k-i)%k))/k<<endl;
	printf("%lld\n",ans);
	return 0;
}

D:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=20005;
long long n,k,w,k1,t,cnt,p,p1[N],kl[N],l[N],r[N],v[N];
int main()
{
	scanf("%d",&n);
	k=1;
	if(n==1)
	{
		printf("2 1\n1 2 0\n");
		return 0;
	}
	t=1;
	while(t*2<=n)
	{
		l[++cnt]=k;
		r[cnt]=k+1;
		v[cnt]=0;
		l[++cnt]=k;
		r[cnt]=k+1;
		v[cnt]=t;
		k++;
		t=t*2;
	}
	k1=k;
	n=n-t;
	w=t;
	while(n>0)
	{
		t=1;
		k=1;
		while(t*2<=n) 
			t=t*2,k++;
		l[++cnt]=k;
		r[cnt]=k1;
		v[cnt]=w;
		w=w+t;
		n=n-t;
	}
	printf("%d %d\n",k1,cnt);
	for(int i=1;i<=cnt;i++)
		printf("%d %d %d\n",l[i],r[i],v[i]);
	return 0;
}
posted @ 2018-09-04 20:46  lokiii  阅读(157)  评论(0编辑  收藏  举报