码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4279 Number 规律题

时间:2014-05-09 22:26:35      阅读:424      评论:0      收藏:0      [点我收藏+]

标签:blog   class   code   c   int   2014   

题意:

定义函数F(x) :

区间[1,x]上的y是满足:GCD(x,y)>1 && x%y>0的 y的个数。


问:对于任意区间[l,r] 上的F(l···r) 有几个函数值是奇数的。

打表找规律。

打的是[1,x]区间的结果

把所有结果不相同的值打出来(因为结果是递增的,所以只观察不相同的结果)

发现:ans = x/2-2 || x/2-1


再把所有结果不同 && x/2-1的值打出来

发现 sqrt(x) &1 == 1

得到:ans = x/2-2 + (sqrt(x)&1);

且x<6时 ans = 0

不知为何交c++就错。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
using namespace std;
#define ll __int64
/*
int Gcd(int x,int y){
	if(x>y)swap(x,y);
	while(x){
		y %= x;
		swap(x,y);
	}
	return y;
}
int f(int x){
	int ans = 0;
	for(int i = 2; i < x; i++)
		ans += (Gcd(i,x)!=1)&&(x%i);
	return ans;
}
int main(){
	int n, last = -1;
	for(int j = 1; j <= 10000; j++){
		n = j;
		int ans = 0;
		for(int i = 1; i <= n; i++)ans += f(i)&1;
		if(ans!=last && j/2!=ans+2){
			last = ans,printf("%5d:%d\n",j,ans);
		}
	}
	return 0;
}/*
*/
int sqrt(__int64 l,__int64 r,__int64 a)
{
	__int64 mid=(l+r)/2;
	if(l>r)
		return r;
	if(a/mid>mid)
		return sqrt(mid+1,r,a);
	else if(a/mid<mid)
		return sqrt(l,mid-1,a);
	else
		return mid;
}
ll go(ll x){
	if(x<5)return 0;
	ll ans = x/2-2;
	ll dou = sqrt(1,x,x);
	dou = dou&1;
	return ans+dou;
}
int main(){
	ll l,r; int T;scanf("%d",&T);
	while(T--){
		scanf("%I64d %I64d",&l,&r);
		printf("%I64d\n", go(r)-go(l-1));
	}
	return 0;
}


HDU 4279 Number 规律题,布布扣,bubuko.com

HDU 4279 Number 规律题

标签:blog   class   code   c   int   2014   

原文地址:http://blog.csdn.net/acmmmm/article/details/25420869

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!