vijosP1447 开关灯泡

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

【思路】

数学+高精度。

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

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

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

【代码】

 #include<iostream>
#include<cstring>
#include<cmath>
using namespace std; const int maxn = +;
struct Bign{
int len;
int num[maxn];
Bign() { memset(num,,sizeof(num)); }
}; Bign goal; Bign times(Bign a,Bign b) {
Bign c;
c.len=a.len+b.len+;
for(int i=;i<a.len;i++)
for(int j=;j<b.len;j++)
c.num[i+j] += a.num[i]*b.num[j];
for(int i=;i<c.len-;i++) {
c.num[i+] += c.num[i]/;
c.num[i] %= ;
}
while(c.num[c.len-]==) c.len--;
return c;
} Bign average(Bign a,Bign b) {
Bign c; c.len=max(a.len,b.len);
for(int i=;i<c.len;i++) {
c.num[i] += a.num[i]+b.num[i];
c.num[i+] += c.num[i]/;
c.num[i] %= ;
} if(c.num[c.len]) c.len++;
for(int i=c.len-;i;i--) {
c.num[i-] += (c.num[i]%) *;
c.num[i] /= ;
}
c.num[]/=;
if(c.num[c.len-]==) c.len--;
return c;
} Bign plustwo(Bign a) {
a.num[] += ;
int i=;
while(i<a.len && a.num[i]>=) {
a.num[i+] += a.num[i]/;
a.num[i] %= ;
i++;
}
if(a.num[a.len]) a.len++;
return a;
} bool over(Bign a,Bign b) {
if(a.len>b.len) return true;
else if(a.len<b.len) return false; for(int i=a.len;i>=;i--) //倒序
if(a.num[i]>b.num[i]) return true;
else if(a.num[i]<b.num[i]) return false; return false;
} int main() {
ios::sync_with_stdio(false);
string s;
cin>>s;
goal.len=s.size();
for(int i=;i<goal.len;i++) goal.num[i]=s[goal.len--i]-'';
Bign L , R=goal , M;
L.len=; L.num[]=;
do
{
M=average(L,R);
if(over(times(M,M),goal)) R=M;
else L=M;
} while(! over(plustwo(L),R)) ;
for(int i=L.len-;i>=;i--) cout<<L.num[i];
return ;
}

vijosP1447 开关灯泡的更多相关文章

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

    P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...

  2. vijos-1447 开关灯泡-大整数开方算法

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

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

    https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...

  4. 2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管 sram rom 微处理 计算机

    现代计算机的各个部件到底是如何通过逻辑电路构成的呢   半加器 我们说过了门电路 看似简单的三种门电路却是组成了整个逻辑电路的根基 真值表--其实就是根据输入输出状态枚举罗列出来的所有可能 比如有一台 ...

  5. [Swift]LeetCode319. 灯泡开关 | Bulb Switcher

    There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every ...

  6. 2019大疆PC软件开发笔试——开关和灯泡两个电路板

    题目描述: 小A是一名DIY爱好者,经常制作一些有趣的东西. 今天,小A突然想要来做这样一个东西.小A现在有两块同样大小为n×m,有n×m块大小为1×1小电路板拼成的矩形电路板,假设叫做电路板A和电路 ...

  7. Leetcode 672.灯泡开关II

    灯泡开关II 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2, 3 . ...

  8. LeetCode:灯泡开关2

    题目 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2, 3 ..., ...

  9. Leetcode 319.灯泡开关

    灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...

随机推荐

  1. PHP学习心得(九)——函数

    一个函数可由以下的语法来定义.任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义. 函数名和 PHP 中的其它标识符命名规则相同.有效的函数名以字母或下划线打头,后面跟字母,数字 ...

  2. leetcode解题—Longest Palindromic Substring

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  3. python函数的返回值 讲解

    我们一起来聊聊python函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样. 首先,写函数的时候,一定要写函数的文档,这样方便我们识别函数是做什么的.我记得很 ...

  4. 数列 COGS1048:[Citric S2] 一道防AK好题

    [题目描述] Czy手上有一个长度为n的数列,第i个数为xi. 他现在想知道,对于给定的a,b,c,他要找到一个i,使得a*(i+1)*xi2+(b+1)*i*xi+(c+i)=0成立. 如果有多个i ...

  5. Oracle登陆及修改用户密码

    16:20 2013/7/7 Oracle 登陆 管理员登陆 sqlplus sys/root as sysdba (密码认证)这个root是安装数据库最初你输入的口令 sqlplus     /as ...

  6. 搭建 Win CE6.0 设备开发环境

    1.操作系统最好基于Windows XP.Vista.Win7 或以上的版本对ActiveSync软件不支持  2.安装VS2008,以及SP1 (一定要装SP1) 3.安装ActiveSync 4. ...

  7. 几个不常见但非常出色的 .NET 开源库

    NLog NLog 目前最为出色的 .NET 日志库,非常容易配置,且极具灵活性.最重要的是与 log4net 相比,NLog 的开发很活跃.顺带提一句,NLog 完全兼容 Mono. Mono.Ce ...

  8. BZOJ 3983 Takeover Wars 解题报告

    我猜了一个结论,能合并就合并,到了必须要敌对交易的时候才进行敌对交易. 然后合并的话,肯定是拿最大的两个去合并. 至于敌对交易,肯定是干掉对方最大的公司才是有意义的. 于是各种分类讨论...看代码好了 ...

  9. ZOJ 3603 Draw Something Cheat

    点我看题目 题意 : 给你n个字符串,让你找出在每个字符串中出现的字母,按字典序输出来. 思路 :一开始想差了,以为记录下每个字符出现次数,然后找次数大于1的,可是我忘了可能在一个字符串中有AA,而另 ...

  10. 来看看Meteor的功能

    看了一上午,感觉这确实比所谓传统的APP开发,有很多不一样的地方. 记录下来: simple-todos.css /* CSS declarations go here */ /* CSS decla ...