【vijos】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盏是亮着的
限制
1s
提示
范围:40%的数据保证,n<=maxlongint
100%的数据保证,n<=10^200
来源
dejiyu@CSC WorkGroup
【vijos】1447 开关灯泡(高精度+特殊的技巧)的更多相关文章
- vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)
P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...
- vijosP1447 开关灯泡
vijosP1447 开关灯泡 链接:https://vijos.org/p/1447 [思路] 数学+高精度. 分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多 ...
- vijos-1447 开关灯泡-大整数开方算法
描述 一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 提示 范围:40 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- 最大化 AIX 上的 Java 性能,第 3 部分: 更多就是更好
http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf3.html 最大化 AIX 上的 Java 性能,第 ...
- 2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管 sram rom 微处理 计算机
现代计算机的各个部件到底是如何通过逻辑电路构成的呢 半加器 我们说过了门电路 看似简单的三种门电路却是组成了整个逻辑电路的根基 真值表--其实就是根据输入输出状态枚举罗列出来的所有可能 比如有一台 ...
- 【高精度】Vijos P1010 清帝之惑之乾隆
题目链接: https://vijos.org/p/1010 题目大意: 多组数据,求R的n次幂(R为不超过9999.9的小数 n<=200)R保证占6位 不输出前导0和后缀0,整数就只输出整数 ...
- 【二分】【高精度】Vijos P1472 教主的集合序列
题目链接: https://vijos.org/p/1472 题目大意: S1={1,2,3…n}.当i>1时,Si为集合Si-1中任意两个不相同数之和的集合. 将每个集合中所有元素取出,集合S ...
- Vijos 1040 高精度乘法
描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...
随机推荐
- Solidworks如何等比例缩小放大模型
比如初始化的模型,笔记本长度只有120mm,实际上应该是3倍左右 右击特征,勾选模具工具,然后可以发现多出来一个页面 点击比例缩放,选中要缩放的特征,设置比例,然后打钩 可以发现已经缩放到 ...
- 关于RecyclerView条目复用
前言 说下前几天遇到的一个小问题,关于RecyclerView条目选中状态的保存.众所周知,RecyclerView被创造出来用于条目的回收利用,但是,当前面回收的条目带有一些特殊的状态(区别于未选中 ...
- <c:forEach items="${revertList}" varStatus="reverts" var="revert" > <dl >
<c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的 ...
- ant design pro 初识
发送请求 上次讲到在api.js中发送请求,模拟了假数据,这次讲一下调用真实接口进行请求并渲染页面. 先完整的过一遍请求吧 首先view层发送请求例如下面的代码: componentDidMount( ...
- 解决64位操作系统下运行psql的问题
我的机器环境是 win7 64位.正常情况下,只需要安装plsql 和 oracle client,配置好 tnsname.ora 就能正常访问数据库.实际上遇到了几个问题. 1. 在tnsnames ...
- 排序(2)---------简单插入排序(C语言实现)
插入排序(Insertion Sort)的算法描写叙述是一种简单直观的排序算法. 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到对应位置并插入.插入排序在实现上,通常 ...
- Spring Bean的作用域类型
Bean的作用域类型 singleton :在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在; prototype :每次从容器中调用Bean时,都返回一个新的实例,即每 ...
- Oem7F7 通用完美激活v7.0绿色版 永久激活Windows7/2008
http://www.21andy.com/blog/20100906/1942.html
- C#Virtual和Override的几种组合
情况1: class A{public void Show()} class B:A{public void Show()} 编译通过,有警告让在B的方法里添加new关键字,以便将A的方法隐藏 编译时 ...
- mybatis想要在控制台显示sql语句配置文件
在src目录下创建一个properties文件 配置内容如下 log4j.rootLogger=debug,stdout,logfile log4j.appender.stdout=org.apach ...