noip模拟32
\(\color{white}{\mathbb{山高而青云冷,池深而蛟穴昏,行以慎步,援以轻身,名之以:落石}}\)
开题发现 \(t1\) 80分特别好写,于是先写了
但是这个做法没有任何扩展性,导致一直没有往正解的方向想
\(t3\) 看见有点的坐标,以为是计算几何,于是写完 \(t1\) 打了个暴力就看 \(t2\) 了
但事实证明 \(t2\) 的难度实际上是最大的,这次题目难度的判断又出现了严重的失误
A. Smooth
观察 B=2 的情况,发现排好序两因子的次数递增是没有规律的
可以把两个因子都开个队列,每次队里是单调递增的,所以队首是最小值
每次取出所有队首中的最小值,即使下一个排名的光滑数
然后运用类似线性筛的东西给每个大于其最小质因子的数加入其乘质数的值
B. Six
首先,要肯定这道题状态只统计每个质因子出现了几次是不行的,比如第一次插入一个6,那么2和3都被标记出现一次,当另一个6来时,发现其因子共出现两次而不能加入序列导致判断出错
所以需要改进状态
那么对于6来说,不能加入的条件是出现过两个2,或两个3,或1个2或1个3
那么不妨记录状态时一对儿一对儿记,这样可以解决上面的尴尬问题
发现总状态数很多,但是有用状态很少,可以记录在 map 里进行离散
可以记忆化搜索,但是感觉不好理解,所以采用递推的写法,每次更新一层,把每层有用的状态放进 vector 里更新即可
代码实现
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
const int maxn=1005;
const int maxm=5e6+5;
int cnt,tot,id[maxn][maxn],cnt1,SS[maxm];
long long n,nn,f[maxm],g[maxm],ans,a[maxm],num[maxm];
vector<pair<int,int> >p,q;
vector<int>to[maxm];
map<pair<int,int>,int>mp;
signed main(){
cin>>n;
nn=n;
for(int i=2;1ll*i*i<=n;i++){
if((n%i)==0){
num[++cnt]=i;
while((n%i)==0){
n/=i;
}
}
}
if(n>1)num[++cnt]=n;
n=nn;
for(ll i=1;1ll*i*i<=n;i++){
if((n%i)==0){
// cout<<"ppp"<<endl;
if(i!=1)a[++cnt1]=i;
if(1ll*i*i!=n)a[++cnt1]=n/i;
}
}
// cout<<cnt1<<" "<<cnt<<endl;
// cout<<"hhh"<<endl;
for(int i=1;i<=cnt1;i++){
for(int j=1;j<=cnt;j++){
if((a[i]%num[j])==0)to[i].push_back(j-1),SS[i]|=(1<<(j-1));
}
}
for(int i=0;i<=cnt-1;i++){
for(int j=0;j<=cnt-1;j++){
if(id[j][i])id[i][j]=id[j][i];
else id[i][j]=++tot;
}
}
q.push_back(make_pair(0,0));
f[0]=1;
int cnt2=0;
for(int i=1;i<=cnt*2+1;i++){
tot=-1;
for(int j=0;j<q.size();j++){
cnt2++;
int S=q[j].first;
int T=q[j].second;
ans=(ans+f[j])%mod;
for(int k=1;k<=cnt1;k++){
bool flag=false;
for(int xx=0;xx<=to[k].size()-1;xx++){
for(int yy=xx;yy<=to[k].size()-1;yy++){
if(T&(1<<id[to[k][xx]][to[k][yy]])){
flag=true;
break;
}
}
if(flag)break;
}
if(flag)continue;
int NT=T;
for(int xx=0;xx<=to[k].size()-1;xx++){
for(int yy=0;yy<=cnt-1;yy++){
if((S&(1<<yy))){
NT|=(1<<id[to[k][xx]][yy]);
}
}
}
pair<int,int>pp=make_pair(S|SS[k],NT);
if(mp.find(pp)==mp.end())mp[pp]=++tot,p.push_back(pp),g[tot]=f[j];
else{
g[mp[pp]]=g[mp[pp]]+f[j];
if(g[mp[pp]]>mod)g[mp[pp]]-=mod;
}
}
}
swap(f,g);
memset(g,0,sizeof g);
swap(p,q);
p.clear();
mp.clear();
}
cout<<ans-1<<endl;
// cout<<cnt2<<endl;
return 0;
}
C. Walker
为什么又是解方程题……
把式子展开,发现有 \(scale*sin\),\(scale*cos\),\(dx\),\(dy\) 四个未知数,选取两个点即可解出来
如果 \(n^2\) 枚举可以保证正确性
但是每次随机两个值,多次循环后不对的概率会降到极低
解出 \(sin\),\(cos\) 的值后可以使用 \(acos\) 这个函数解出弧度值,注意正负性不确定需要用 \(sin\) 进行验证
\(\color{white}{\mathbb{又恐琼楼玉宇,高处不胜寒}}\)
noip模拟32的更多相关文章
- noip模拟32[好数学啊]
noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...
- Noip模拟32(再度翻车) 2021.8.7
T1 Smooth 很水的一道题...可是最傻 的是考场上居然没有想到用优先队列优化... 上来开题看到这个,最一开始想,这题能用模拟短除法,再一想太慢了,就想着优化 偏偏想到线性筛然后试别的素 ...
- 2021.8.6考试总结[NOIP模拟32]
T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...
- NOIP模拟 32
我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...
- NOIP 模拟 $32\; \rm Walker$
题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\ ...
- NOIP 模拟 $32\; \rm Six$
题解 二维状压. 第一维直接压选不同质因子的方案,第二位压方案. 分两种讨论,显然一种方案最多出现两次,否则就不合法了,所以一种是出现了一次的,另一种是出现了两次的,这样可以减小状态数. 实现可以用 ...
- NOIP 模拟 $32\; \rm Smooth$
题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但 ...
- noip模拟33
\(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
随机推荐
- [源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van
[源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van 目录 [源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van 0x00 摘要 0x01 功能 ...
- 3分钟搭建一个网站?腾讯云Serverless开发体验
作为一个开发者,应该都能理解一个网站从开发到上线,要经过很多繁琐的步骤. 编写代码,部署应用,部署数据库,申请域名,申请SSL证书,域名备案,到最终上线起码要几天时间. 作为一个不精通代码的业务玩家, ...
- Mysql命令语句
常用的管理命令 SHOW DATABASES; //显示当前服务器下所有的数据库 USE 数据库名称; //进入指定的数据 show tables; ...
- kivy中文编程指南
Kivy中文编程指南,由网友翻译后,我整理目录及页面形式,便了浏览查阅. 点击下载
- i春秋“百度杯”CTF比赛 十月场-Vld(单引号逃逸+报错注入)
题目源代码给出了提示index.php.txt,打开拿到了一段看不太懂得东西. 图片标注的有flag1,flag2,flag3,同时还有三段字符,然后还出现了_GET,脑洞一一点想到访问 ?flag1 ...
- OpenGL学习笔记(六)坐标系统
目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...
- 原生js 以ajax(post)的方式传json至php,并让php解析为数组
如题. 比如要把一个json,如 json= {name:"John Rambo", time:"3pm"},,通过js ,传到一个php服务器 fwq.php ...
- arraycopy将数组分为两部分时游标的设置方法
System.arraycopy是复制数组的一个常用工具,它在游标处如何分为两个是一个需要注意的问题,例如下面的示例代码: byte [] src = { 104, 101, 108, 108, 11 ...
- Manage Historical Snapshots in Sonarqube
Login as admin, go to a dashboard of a project, then click "Configuration -> History" a ...
- html 去除重复边框
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...