T1

暴力很好打,然而我是最后打的,所以只有40pts,其他人都有80pts的说

其实也应该想到的吧

80pts用的 \(set\) ,有个log,所以A不了。

正解:

把 \(set\) 换成 \(queue\) ,开 \(b\) 个 队列,队首依次塞进对应的素数,每次操作取出队首元素最小的队列,用该队列的队首元素去更新它本身及其之后的队列,在队尾加入乘上该队列所对应的素数即可。

注意,第一次队列里没塞1,直接塞素数,相当于进行了一次操作,所以当操作到第 \(k-1\) 次时,直接输出当前拿出的队列的队首元素即可。

\(queue\) 每次操作都是 \(O(1)\) 的,所以总复杂度 \(O(BK)\) ,可过。

Code
#include<queue>
#include<cstdio>
#define re register
#define int64_t long long
using std::queue;
namespace OMA
{
int k,b;
queue<int64_t>q[16];
int f[16]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
signed main()
{
scanf("%d%d",&b,&k);
for(re int i=1; i<=b; i++)
{ q[i].push(f[i]); }
for(re int i=1,id=1; i<=k-1; i++,id=1)
{
for(re int j=2; j<=b; j++)
{ if(q[j].front()<=q[id].front()){ id = j; } }
for(re int j=id; j<=b; j++)
{ q[j].push(1LL*f[j]*q[id].front()); }
if(i==k-1)
{ printf("%lld\n",q[id].front()); return 0 ; }
q[id].pop();
}
return 0;
}
}
signed main()
{ return OMA::main(); }

T2

记搜。

Code
#include<map>
#include<cstdio>
#define a first
#define b second
#define re register
#define int long long
using std::map;
using std::pair;
using std::make_pair;
const int MAX = 1<<6;
typedef pair<int,int>my;
namespace OMA
{
my d[7];
int n,cnt,top;
map<my,int>dp;
int id[MAX],sum[MAX];
const int p = 1e9+7;
inline int dfs(int tmp,my res)
{
if(dp[res])
{ return dp[res]; }
dp[res] = 1;
for(re int i=1; i<=top; i++)
{
int tot = 0,flag = 0;
for(re int j=1; j<=top; j++)
{
if(!(i&j))
{ continue ; }
if((res.a>>j)&1)
{ tot++; }
if((res.b>>j)&1)
{ flag = 1; }
if(flag||tot>1)
{ break ; }
}
if(flag||tot>1)
{ continue ; }
if((res.a>>i)&1)
{ (dp[res] += sum[i]%p*dfs(tmp+1,make_pair(res.a^(1LL<<i),res.b|(1LL<<i)))%p) %= p; }
else
{ (dp[res] += sum[i]%p*dfs(tmp+1,make_pair(res.a|(1LL<<i),res.b))%p) %= p; }
}
return dp[res];
}
signed main()
{
scanf("%lld",&n);
for(re int i=2; i*i<=n; i++)
{
if(n%i==0)
{
d[++cnt].a = i;
while(n%i==0)
{ d[cnt].b++,n /= i; }
}
}
if(n!=1)
{ d[++cnt] = make_pair(n,1); }
for(re int i=1; i<=cnt; i++)
{ id[1<<i-1] = i; /*printf("%lld %lld\n",d[i].a,d[i].b);*/ }
top = (1<<cnt)-1,sum[0] = 1;
for(re int i=1; i<=top; i++)
{ sum[i] = sum[i^(i&-i)]*d[id[i&-i]].b; /*printf("%lld ",sum[i]);*/ }
//printf("\n");
printf("%lld\n",dfs(0,make_pair(0,0))-1);
return 0;
}
}
signed main()
{ return OMA::main(); }

T3

看起来比较可做的一道,高斯消元很好想到,方程求解,代入检验。

然而我题读错+不会求 \(\theta\) ,就只拿了30pts。

正解:

按照题目所说的坐标转换,随机找组坐标列两个方程,发现一共有四个未知量,分别为 \(\cos{\theta}\times scale ,\sin{\theta}\times scale,d_{x},d_{y}\) ,所以就再随机找一组坐标来求解,每次求解完,带回检验是否符合要求。

发现,求解出来的是 \(\cos{theta}\times scale,\sin(\theta)\times scale\) ,所以如何求 \(scale\) 和 \(\theta\) ?

  1. \(scale\) ,根据三角函数相关知识 \(\sin^{2}{\theta}+\cos^{2}{\theta}=1\) 可求得 \(scale\) ,给那俩玩意平方相加开根号即可。

  2. \(\theta\),camth库自带函数 \(acos\) ,记得根据 \(\sin\) 值调整正负。

每回随机找两组,因为要求一半以上,所以找对的概率为 \(\frac{1}{4}\),找错的概率为 \(\frac{3}{4}\),找50组,\(\frac{3}{4}^{50}<10^{-5}\),所以可过。

复杂度 \(O(n)\) ,附带比较大的常数(上界大概为50)。

剩下的就是调试的问题,很exsb,给方程赋值的时候一定不要搞错了,注意统计合法非法时的判断条件,不要混用。

scale记得开根号

附带一系列精美调试信息

Code
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#define MAX 100010
#define re register
namespace OMA
{
int n,m=4;
double ar[5][6],tmp[5];
double x1[MAX],y1[MAX],x2[MAX],y2[MAX];
const double eps = 1e-6;
inline double abs(double a)
{ return a>=0.0?a:-a; }
inline void swap(double &a,double &b)
{ double t=a; a=b; b=t; }
inline void Gauss()
{
for(re int i=1; i<=m; i++)
{
int k = i;
for(re int j=i+1; j<=m; j++)
{
//if(abs(ar[j][j])>eps&&j<i)
//{ continue ; }
if(abs(ar[j][i])>abs(ar[k][i]))
{ k = j; }
}
for(re int j=1; j<=m+1; j++)
{ swap(ar[i][j],ar[k][j]); }
//if(abs(ar[i][i])<=eps)
//{ continue ; }
for(re int j=1; j<=m; j++)
{
if(i!=j)
{
double temp = ar[j][i]/ar[i][i];
for(k = i+1; k<=m+1; k++)
{ ar[j][k] -= temp*ar[i][k]; }
}
}
}
for(re int i=1; i<=m; i++)
{ tmp[i] = ar[i][m+1]/ar[i][i]; }
}
struct stream
{
template<typename type>inline stream &operator >>(type &s)
{
int w=1,k=0,a=0,b=0; s=0; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while((ch>='0'&&ch<='9')||ch=='.')
{
if(ch=='.'){ b = 1; }
else if(!b)
{ s = s*10+ch-'0'; }
else
{ k = k*10+ch-'0',a++; }
ch = getchar();
}
return s=(pow(0.1,a)*k+s)*w,*this;
}
}cin;
signed main()
{
srand(time(NULL));
cin >> n;
for(re int i=1; i<=n; i++)
{ cin >> x1[i] >> y1[i] >> x2[i] >> y2[i]; }
int cnt = 0;
while(cnt<=50)
{
int p1 = rand()%n+1,p2 = rand()%n+1;
if(p1==p2)
{ continue ; }
cnt++;
ar[1][1] = x1[p1],ar[1][2] = -y1[p1],ar[1][3] = 1,ar[1][4] = 0,ar[1][5] = x2[p1];
ar[2][1] = y1[p1],ar[2][2] = x1[p1],ar[2][3] = 0,ar[2][4] = 1,ar[2][5] = y2[p1];
ar[3][1] = x1[p2],ar[3][2] = -y1[p2],ar[3][3] = 1,ar[3][4] = 0,ar[3][5] = x2[p2];
ar[4][1] = y1[p2],ar[4][2] = x1[p2],ar[4][3] = 0,ar[4][4] = 1,ar[4][5] = y2[p2];
Gauss();
int many = 0;
for(re int i=1; i<=n; i++)
{
if(abs(x1[i]*tmp[1]-y1[i]*tmp[2]+tmp[3]-x2[i])<=eps&&abs(y1[i]*tmp[1]+x1[i]*tmp[2]+tmp[4]-y2[i])<=eps)
{ many++; }
}
//printf("many=%d\n",many);
if(many>n/2)
{
//printf("QAQ\n");
double scale = sqrt(tmp[1]*tmp[1]+tmp[2]*tmp[2]);
/*for(re int i=1; i<=m; i++)
{
for(re int j=1; j<=m+1; j++)
{ printf("%0.6lf ",ar[i][j]); }
printf("\n");
}*/
//printf("cos=%0.10lf sin=%0.10lf\n",tmp[1]/scale,tmp[2]/scale);
printf("%0.10lf\n%0.10lf\n%0.10lf %0.10lf\n",(tmp[2]/scale>=0.0?1.0:-1.0)*acos(tmp[1]/scale),scale,tmp[3],tmp[4]);
return 0;
}
}
return 0;
}
}
signed main()
{ return OMA::main(); }

反思总结:

  1. 打暴力不要占用太多时间,但一定要都打上,能优化的地方尽量去优化。
  2. 注意开题顺序,不要死磕一道题。
  3. 注意细节,读题不要出错。真不知道为什么都加粗了我还没看见

noip32的更多相关文章

随机推荐

  1. 使用Hugo框架搭建博客的过程 - 功能拓展

    前言 本文介绍一些拓展功能,如文章页面功能增加二级菜单,相关文章推荐和赞赏.另外,使用脚本会大大简化写作后的上传流程. 文章页面功能 这部分功能的拓展主要是用前端的JS和CSS,如果对前端不了解,可以 ...

  2. Charles使用笔记001

    一.抓电脑的请求 Proxy-->勾选Windows Proxy 二.Charles 拦截原理 三.Charles 拦截修改数据 选择一个链接-->右键-->勾选Breakpoint ...

  3. uni-app中当uni.navigateTo传的参数为object时,通过传递的不同参数,在显示单页面内通过v-if判断显示出对应的内容(可实现多页面效果)

    通过uni-app中当uni.navigateTo传的参数为object时,通过传递的不同参数,在显示单页面内通过v-if判断显示出对应的内容(可实现多页面效果) 起始页跳转到对应页面,并传递参数(o ...

  4. js树形数据结构的扁平化

    前面我们封装了一维数组(具备树形结构相关属性)处理成树形结构的方法:https://www.cnblogs.com/coder--wang/p/15013664.html 接下来我们来一波反向操作,封 ...

  5. P4494 [HAOI2018]反色游戏

    P4494 [HAOI2018]反色游戏 题意 给你一个无向图,图上每个点是黑色或者白色.你可以将一条边的两个端点颜色取反.问你有多少种方法每个边至多取反一次使得图上全变成白色的点. 思路 若任意一个 ...

  6. Spring自动装配(二)

    为什么Spring要支持Autowire(自动装配) 先写几个类,首先定义一个Animal接口表示动物: 1 public interface Animal { 2 3 public void eat ...

  7. Springboot+Mybatis+小程序

    思维导图: 项目效果图 一览界面: 新增界面:

  8. odoo14里面给下载PDF附件加水印

    依赖包:pip install reportlab Odoo 中附件的下载会经过 ir.http 的 def binary_content() 方法获取附件内容等必要信息, 所以我们需要继承 ir.h ...

  9. 第十七篇 -- QTreeWidget与QDockWidget

    效果图: 目录和工具条的创建在前面几节就已经学过了,所以目录和工具条的布局可以自己画. 那么下面的部分,左侧是一个DockWidget,里面放置一个TreeWidget.右边是一个ScrollArea ...

  10. HCNA Routing&Switching之交换技术基础

    什么是交换机?顾名思义,交换机就是用来数据包交换的:广泛用于终端接入:它的前身是hub(集线器),hub是一个古老的设备,它的作用也是用于终端接入,但hub有一个最大的缺点是它不能隔离冲突域:所谓冲突 ...