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. object-c 1

    多个参数的写法 (方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ; 举个例子,一个方法的定义: -(void) setKids ...

  2. Docker容器中运行ASP.NET Core

    在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...

  3. SpringMVC最基础配置

    SpringMVC和Struts2一样,是前后台的一个粘合剂,struts2用得比较熟悉了,现在来配置一下SpringMVC,看看其最基础配置和基本使用.SpriingMVC不是太难,学习成本不高,现 ...

  4. 映像备份与恢复管理工具Easy Image X使用说明

    Easy Image X(简称EIX)是一个支持Ghost映像(.gho)和ImageX映像(.wim)的映像管理工具,具有友好的图形界面,仅需几步简单操作即可完成映像备份与恢复工作.维护时使用最多的 ...

  5. boost 编译

    备份一下,用的时候直接粘贴,免得到处找>_< 32 bjam threading=multi link=static runtime-link=static --stagedir=stag ...

  6. new reader

    BufferedReader bufferedReader = new BufferedReader( new StringReader(charset.decode(inBuffer).toStri ...

  7. [二分匹配]URAL1721Two Sides of the Same Coin

    题意:给n个人,每个人都有3个参数,分别是名字,能做的事(a:statements  b:testdate  a.b都可以:anything),Rank 要求:一个人只能做一个事件,要两个人Rank相 ...

  8. GridView使用CommandField删除列实现删除时提示确认框

    在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除 GridView在使用CommandField删除时弹出提示 ...

  9. [jobdu]数组中出现次数超过一半的数字

    找到以后要再扫一遍确认. http://zhedahht.blog.163.com/blog/static/25411174201085114733349/ #include <iostream ...

  10. Java异常处理之try-catch-finally

    /** * @author Administrator * 功能:异常 */ package com.test; import java.io.*; import java.net.*; public ...