\(\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的更多相关文章

  1. noip模拟32[好数学啊]

    noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...

  2. Noip模拟32(再度翻车) 2021.8.7

    T1 Smooth 很水的一道题...可是最傻    的是考场上居然没有想到用优先队列优化... 上来开题看到这个,最一开始想,这题能用模拟短除法,再一想太慢了,就想着优化 偏偏想到线性筛然后试别的素 ...

  3. 2021.8.6考试总结[NOIP模拟32]

    T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...

  4. NOIP模拟 32

    我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...

  5. NOIP 模拟 $32\; \rm Walker$

    题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\ ...

  6. NOIP 模拟 $32\; \rm Six$

    题解 二维状压. 第一维直接压选不同质因子的方案,第二位压方案. 分两种讨论,显然一种方案最多出现两次,否则就不合法了,所以一种是出现了一次的,另一种是出现了两次的,这样可以减小状态数. 实现可以用 ...

  7. NOIP 模拟 $32\; \rm Smooth$

    题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但 ...

  8. noip模拟33

    \(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...

  9. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

随机推荐

  1. SpringBoot自动装配-Import

    1. 简介 @Import导入的类会被Spring加载到IOC容器中.而@Import提供4中用法: 导入Bean 导入配置类 导入 ImportSelector 实现类.一般用于加载配置文件中的类 ...

  2. 记录21.07.20 —— js语言回顾

    js语言回顾 1.语法 a并没有声明,也可以输出,不会报错. 添加一条语句 则需要声明,称之为严谨语法 2.数组 2.1数组遍历三种方法 for-in与for-of forEach forEach调用 ...

  3. Java面向对象12——static详解

    static  package oop.demon01.demon07; ​ // static : public class Student { ​     private static int a ...

  4. Linux命令(九)之安装mysql

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. Mantis安装过程笔记

    安装平台:Windows Server 2003 R2 Enterprise x64 Edition 软件: EasyPHP-5.3.6.1 mantisbt-1.2.6 安装过程: 首先安装Easy ...

  6. shell脚本——awk

    目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...

  7. Golang语言系列-01-Go语言简介和变量

    Go语言简介 Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pi ...

  8. Qt开发Gif播放器

    一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->Gif播放器(包含整个工程源码,vs2019打开即可编译运 ...

  9. Windows莫名内存到百分之百,需要修改虚拟内存

    借鉴别人的操作: https://blog.csdn.net/xjpdf10/article/details/82849112

  10. ubunt中,使用命令su命令切换root账户,提示认证失败

    报错截图: 解决方法: sudo passwd 重新设置root账户的密码,确认root账户的密码(再次输入密码),然后su ,输入root账户刚刚设置的密码即可切入到root账户: