vijosP1447 开关灯泡

链接:https://vijos.org/p/1447

【思路】

数学+高精度。

分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多少次,因为初始全部熄灭,所以操作数为奇的灯最后会亮着,再进一步,只有序号为平方数的灯在最后会亮着。

由此题目转化为求n以内平方数的个数,个数为sqrt(n)个(别问我怎么知道的=_=)

数据范围要求我们用到高精。至此,题目就是对一个大数开方的问题,NOIP的初赛曾出现过这个程序。

【代码】

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 using namespace std;
 5
 6 const int maxn = 200+10;
 7 struct Bign{
 8     int len;
 9     int num[maxn];
10     Bign() {  memset(num,0,sizeof(num)); }
11 };
12
13 Bign goal;
14
15 Bign times(Bign a,Bign b) {
16     Bign c;
17     c.len=a.len+b.len+2;
18     for(int i=0;i<a.len;i++)
19       for(int j=0;j<b.len;j++)
20         c.num[i+j] += a.num[i]*b.num[j];
21     for(int i=0;i<c.len-1;i++) {
22         c.num[i+1] += c.num[i]/10;
23         c.num[i] %= 10;
24     }
25     while(c.num[c.len-1]==0) c.len--;
26     return c;
27 }
28
29 Bign average(Bign a,Bign b) {
30     Bign c; c.len=max(a.len,b.len);
31     for(int i=0;i<c.len;i++) {
32         c.num[i] += a.num[i]+b.num[i];
33         c.num[i+1] += c.num[i]/10;
34         c.num[i] %= 10;
35     }
36
37     if(c.num[c.len]) c.len++;
38     for(int i=c.len-1;i;i--) {
39         c.num[i-1] += (c.num[i]%2) *10;
40         c.num[i] /= 2;
41     }
42     c.num[0]/=2;
43     if(c.num[c.len-1]==0) c.len--;
44     return c;
45 }
46
47 Bign plustwo(Bign a) {
48     a.num[0] += 2;
49     int i=0;
50     while(i<a.len && a.num[i]>=10) {
51         a.num[i+1] += a.num[i]/10;
52         a.num[i] %= 10;
53         i++;
54     }
55     if(a.num[a.len]) a.len++;
56     return a;
57 }
58
59 bool over(Bign a,Bign b) {
60     if(a.len>b.len) return true;
61     else if(a.len<b.len) return false;
62
63     for(int i=a.len;i>=0;i--) //倒序
64       if(a.num[i]>b.num[i]) return true;
65       else if(a.num[i]<b.num[i]) return false;
66
67     return false;
68 }
69
70 int main() {
71     ios::sync_with_stdio(false);
72     string s;
73     cin>>s;
74     goal.len=s.size();
75     for(int i=0;i<goal.len;i++) goal.num[i]=s[goal.len-1-i]-‘0‘;
76     Bign L , R=goal , M;
77     L.len=1; L.num[0]=1;
78     do
79      {
80            M=average(L,R);
81            if(over(times(M,M),goal)) R=M;
82            else L=M;
83     } while(! over(plustwo(L),R)) ;
84     for(int i=L.len-1;i>=0;i--) cout<<L.num[i];
85     return 0;
86 }
时间: 2024-08-27 18:32:01

vijosP1447 开关灯泡的相关文章

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^

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

https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇数!(包括1和他自己)!!! 在区间[1, n]中,一共有sqrt(n)个完全平方数!(这个多想想就知道了...) 然后就是高精度...高精度的开方不难写,(但是我在我的高精模板上找到了错误good..就是不要memset整个数组,要不然果断tle)二分mid然后验证即可. #include <cs

电子积木

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

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存不下(⊙_⊙)

硬件杂谈

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

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

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

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(组合计数+奇怪的题)