【vijos】1447 开关灯泡(高精度+特殊的技巧)

https://vijos.org/p/1447

一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的。

竟然没想到完全平方数。。sad。。

在正因子中,只有完全平方数的正因子才是奇数!(包括1和他自己)!!!

在区间[1, n]中,一共有sqrt(n)个完全平方数!(这个多想想就知道了。。。)

然后就是高精度。。。高精度的开方不难写,(但是我在我的高精模板上找到了错误good。。就是不要memset整个数组,要不然果断tle)二分mid然后验证即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,(a),sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << ‘\t‘; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=100005;
int f[11][N+5], tp1[N+5], tp2[N+5], tp3[N+5], tp4[N+5], Ten[N+5], One[N+5], Two[N+5];
char s[N+5];
void Plus(int *a, int *b, int *c);
void Print(int *a);
inline void fix1(int *a, int len) { while(len>1 && !a[len]) --len; a[0]=len; }
inline void fix2(int *a, int *b, int *c) { c[N]=(a[N]^b[N])&&(!(c[0]==1 && c[1]==0)); }
inline void upd(int *a) { memset(a, 0, sizeof(int)*(a[0]+1)); a[0]=1; }
inline void Init() { Ten[0]=2; Ten[2]=1; One[0]=One[1]=1; Two[0]=1; Two[1]=2; }
bool cmp(int *a, int *b) {
	if(a[N]^b[N]) return a[N];
	if(a[N]==1) swap(a, b);
	if(a[0]<b[0]) return 1; else if(a[0]>b[0]) return 0;
	for3(i, a[0], 1) if(a[i]<b[i]) return 1; else if(a[i]>b[i]) return 0;
	return 0;
}
void Minus(int *a, int *b, int *c) {
	int i, flag=0;
	if(a[N] && b[N]) { b[N]=a[N]=0; Minus(b, a, c); b[N]=a[N]=1; return; }
	if(b[N]) { b[N]=0; Plus(a, b, c); b[N]=1; return; }
	if(a[N]) { b[N]=1; Plus(a, b, c); b[N]=0; return; }
	if(cmp(a, b)) flag=1, swap(a, b);
	upd(c);
	for(i=1; i<=a[0]; ++i) {
		c[i]+=a[i]-b[i];
		while(c[i]<0) c[i]+=10, c[i+1]-=1;
	}
	fix1(c, i); if(flag) c[N]=1;
}
void Plus(int *a, int *b, int *c) {
	if(a[N]^b[N]) { if(a[N]) { a[N]=0; Minus(b, a, c); a[N]=1; } else { b[N]=0; Minus(a, b, c); b[N]=1; } return; }
	upd(c);
	int k=0, len=max(a[0], b[0]), i;
	for(i=1; i<=len || k; ++i) {
		c[i]=a[i]+b[i]+k;
		k=c[i]/10; if(c[i]>=10) c[i]%=10;
	}
	fix1(c, i); c[N]=a[N];
}
void Multi(int *a, int *b, int *c) {
	upd(c);
	for1(i, 1, a[0]) for1(j, 1, b[0]) c[i+j-1]+=a[i]*b[j];
	int k=0, i, len=a[0]+b[0]-1;
	for(i=1; i<=len || k; ++i) {
		c[i]+=k;
		k=c[i]/10; if(c[i]>=10) c[i]%=10;
	}
	fix1(c, i); fix2(a, b, c);
}
void Div(int *a, int *b, int *c) {
	upd(c); upd(tp1); upd(tp2); upd(tp3);
	int i, *t=tp1, *ans=tp2, *k=tp3, flag=b[N]; b[N]=0;
	for(i=a[0]; i>=1; --i) {
		Multi(k, Ten, t); swap(k, t);
		k[1]=a[i];
		Multi(ans, Ten, t); swap(ans, t);
		while(!cmp(k, b)) {
			Plus(ans, One, t); swap(ans, t);
			Minus(k, b, t); swap(k, t);
		}
	}
	memcpy(c, ans, sizeof(int)*(ans[0]+1));
	b[N]=flag;
	fix1(c, a[0]); fix2(a, b, c);
}
void Print(int *a) {
	if(a[N]) printf("-");
	for3(i, a[0], 1) print(a[i]);
	puts("");
}
void stoi(char *x, int *a) {
	int len=strlen(s), i=0;
	if(x[0]==‘-‘) a[N]=1, ++i; a[0]=len-i;
	for(; i<len; ++i) a[len-i]=s[i]-‘0‘;
}
void sqrt(int *a, int *c) {
	upd(c);
	int *l=f[3], *r=f[4], *m=f[5], *t=f[6];
	l[0]=1; r[a[0]+1]=1; r[0]=a[0]+1;
	while(cmp(l, r)) {
		upd(t); upd(m);
		Plus(l, r, t);
		Div(t, Two, m);
		Multi(m, m, t);
		if(!cmp(a, t)) { swap(l, m); Plus(l, One, t); swap(l, t); }
		else swap(r, m);
	}
	Minus(l, One, t); swap(l, t);
	memcpy(c, l, sizeof(int)*(N+5));
}
int main() {
	Init();
	scanf("%s", s); stoi(s, f[1]);
	sqrt(f[1], f[2]);
	Print(f[2]);
	return 0;
}

描述

一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的。

格式

输入格式

一个数n

输出格式

m,表示最后有m盏是亮着的

样例1

样例输入1[复制]

5

样例输出1[复制]

2

限制

1s

提示

范围:40%的数据保证,n<=maxlongint
100%的数据保证,n<=10^200

来源

[email protected] WorkGroup

时间: 2024-08-05 23:04:43

【vijos】1447 开关灯泡(高精度+特殊的技巧)的相关文章

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

vijos - P1447开关灯泡 (大数模板 + 找规律 + 完全数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 样例1 样例输入1[复制] 5 样例输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=10^

vijosP1447 开关灯泡

链接:https://vijos.org/p/1447 [思路] 数学+高精度. 分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多少次,因为初始全部熄灭,所以操作数为奇的灯最后会亮着,再进一步,只有序号为平方数的灯在最后会亮着. 由此题目转化为求n以内平方数的个数,个数为sqrt(n)个(别问我怎么知道的=_=) 数据范围要求我们用到高精.至此,题目就是对一个大数开方的问题,NOIP的初赛曾出现过这个程序. [代码] 1 #include<iostream>

10月刷题总结

(写的题真少QAQ 动态规划: [vijos]1286 座位安排(状压dp) [BZOJ]1026: [SCOI2009]windy数(数位dp) [BZOJ]1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧) [BZOJ]1827: [Usaco2010 Mar]gather 奶牛大集会(树形dp) [BZOJ]2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛(树形dp) 计数: [vijos]1789 String(组合计数+奇怪的题)

硬件杂谈

http://antkillerfarm.github.io/ 开篇的话 自从改行做起了驱动软件工程师,好多硬件的问题已经不再像当初那样,可以忽略不计了.于是就有了以下的心得. 0欧电阻的作用 在硬件原理图,特别是硬件草案的原理图中,常可看到0欧的电阻.0欧的电阻在效果上当然等同于导线,辛辛苦苦把它引出来焊上,究竟有何用处呢?硬件的同事告诉我,他们一般只在某些新添加的电路上使用这东西.一旦由于某些原因需要去掉新添加的电路的话,只要用电烙铁把电阻取下来就可以了,而不用再造一批测试版. 空指针 空指

电子积木

姑妈妈送给儿子的生日礼物~电子积木,在生日那天到货,儿子非常喜欢,积木配套了一个手提箱,儿子小心翼翼拆箱一改往日的暴力拆包,嘴里还小声念到好精密的仪器. 从传统积木到乐高到现在的电子积木,儿子的玩具不断更新换代,这次还能感受电能带来的魔力,他充满好奇. 到货的那天我跟儿子一起照着说明书组装了一个最简单的模型,电源+开关+灯泡,在开关启动后电灯亮的那一刻儿子显得特别激动,第一时间分享给外公和外婆,自己动手完成的一个作品让他对电有了一定认识. 这几天雾霾加剧,幼儿园虽然没有停课但去的小朋友已经很少了

Javascript 6-特效学习

基本思想:用js动态地操作dom. 开关灯泡:

UVa 10110 - Light, more light

题目:有一个人负责开关走廊中的灯泡.走廊有n个灯泡(编号从1到n),他会来回走上n趟: 在第 i 趟开始走过去的时候,他会开关灯泡编号可以被 i 整除的灯泡: 现在要算出在走完n趟之后,最后一个电灯泡(编号n)是亮着的还是暗着的. 分析:数学.本题就是再求n个因数的个数的奇偶性. 如果 x|n,那么n/x | n,因此都是成对出现的: 这里有一个特例,如果n是完全平方数,那么sqrt(n)只会出现一次: 所以,n是完全平方数,则因数为奇数个:否则,因数为偶数个. 说明:注意int存不下(⊙_⊙)

向来可靠的智能家居协议ZigBee,就这么给黑帽子黑了?-南京物联传感招商加盟总部

哪种无线通信协议最适合智能家居?ZigBee当仁不让.近年来,为了争夺潜力无限的智能家居市场,围绕各类无线协议标准的争论不断,但不可否认,ZigBee赚足了眼球,颇受关注和信赖.在智能家居领域,相较于蓝牙.WiFi.Z-Wave.射频等技术协议,ZigBee一直光彩夺目,鲜有负面消息,可谓有口皆碑,深得人心,并被很多人默认为目前最适宜智能家居的协议标准. 而之所以如此,一方面与ZigBee协议本身分不开,另一方面则要感谢一些企业的大力热捧和宣扬. ——技术层面,ZigBee不是为智能家居而生,却