三角函数公式

同角三角函数基本关系 $\sin^2\alpha+\cos^2\alpha=1$ $\tan\alpha=\dfrac{\sin\alpha}{\cos\alpha}$ 诱导公式 口诀:奇变偶不变,符号看象限。 $\sin(\alpha+ 2k\pi)=\sin \alpha,k\in \mathbb{Z} \\cos(\alpha+ 2k\pi)=\cos \alpha,k\in \mathbb{Z} \\tan(\alpha+ 2k\pi)=\tan \alpha,k\in \mathbb{Z}$ $\sin(-\alpha)=-\sin\alpha \\cos(-\alpha)=\cos\alpha \\tan(-\alpha)=-\tan\alpha$ $\sin(\pi-\alpha)=\sin\alpha \\cos(\pi-\alpha)=-\cos\alpha \\tan(\pi-\alpha)=-\tan\alpha$ $\sin(\pi+\alpha)=-\sin\alpha \\cos(\pi+\alpha)=-\cos\alpha \\tan(\pi+\alpha)=\tan\alpha$ $\sin(\frac{\pi}{2}+\alpha)=\cos\alpha \\cos(\frac{\pi}{2}+\alpha)=-\sin\alpha \\tan(\frac{\pi}{2}+\alpha)=-\cot\alpha \\cot(\frac{\pi}{2}+\alpha)=-\tan\alpha$ $\sin(\frac{\pi}{2}-\alpha)=\cos\alpha \\cos(\frac{\pi}{2}-\alpha)=\sin\alpha \\tan(\frac{\pi}{2}-\alpha)=\cot\alpha \\cot(\frac{\pi}{2}-\alpha)=\tan\alpha$ 两角和差公式 $\sin(\alpha\pm\beta)=\sin\alpha\cos\beta\pm\sin\beta\cos\alpha \\cos(\alpha\pm\beta)=\cos\alpha\cos\beta\mp\sin\alpha\sin\beta \\tan(\alpha\pm\beta)=\dfrac{\tan\alpha\pm\tan\beta}{1\mp\tan\alpha\tan\beta} \\cot(\alpha\pm\beta)=\dfrac{\cot\alpha\cot\beta\mp 1}{\cot\beta\pm\cot\alpha}$ 二倍角公式 $\sin 2\alpha=2\sin\alpha\cos\alpha \\cos 2\alpha=\cos^2\alpha-\sin^2\alpha=2\cos^2\alpha-1=1-2\sin^2\alpha \\tan 2\alpha=\dfrac{2\tan\alpha}{1-\tan^2\alpha} \\cot 2\alpha=\dfrac{\cot^2\alpha-1}{2\cot\alpha}$ 万能公式 记 $t=\tan\alpha$。 $\sin\ 2\alpha=\frac{2t}{1+t^2} \\cos 2\alpha=\frac{1-t^2}{1+t^2} \\tan 2\alpha=\frac{2t}{1-t^2}$ 降幂公式 $\sin^2\alpha=\dfrac{1-\cos 2\alpha}{2}$

January 11, 2026 · 1 min · 61 words

抓取钉钉智能出勤的数据

众所周知,钉钉的智能出勤在基础配置页面,在有权限但不足时,你可以看到所有人的信息,但会不给你批量导出,但是你还是能读取和直接复制(如果有这个权限的话)。 但是如果没有权限还想全部导出怎么办捏? 抓取和重发网络请求 考虑能否让一页上加载全部的人员信息。 先看眼它数据的网络请求是怎么发过来的。调整页面右下方的 每页显示,提前打卡 F12 并先清掉网络请求,看到发了个 queryThroughView.json 的 GET 请求。它的请求 URL 大概长这个样子(关键信息已经打码): https://psjvlw.aliwork.com/dingtalk/web/APP_MAAH47PDBDYNVWONJDU1/query/dataQuery/queryThroughView.json?_api=DataManage.queryThroughView&_mock=false&_csrf_token=***&_locale_time_zone_offset=28800000&searchField=%5B%5D&pageSize=50&currentPage=1&page=1&limit=50&manageUuid=FORM-***&appType=APP_MAAH47PDBDYNVWONJDU1&formUuid=FORM-***&associatedFormInstId=&associatedFormUuid=&allText=&viewUuid=VIEW-***&filterRule=%7B%22condition%22%3A%22%22%2C%22rules%22%3A%5B%5D%7D&sort=%5B%5D&manageScene=WORKBENCH&subTableLimit=10&logicOperator=&_stamp=*** 发现 limit 和 pageSize 是写在请求里的,尝试改一下再发个网络请求试试看: 有点倒闭,确实请求成功了某页的 JSON 格式数据,但是返回的 limit 还是 $50$。 爬取各个页面数据 但是我们可以改变 page 的值,爬完所有 JSON 数据再一起导出。 (本部分代码由 Gemini 所写,在此感谢) 1const baseUrl = 'https://psjvlw.aliwork.com/dingtalk/web/APP_MAAH47PDBDYNVWONJDU1/query/dataQuery/queryThroughView.json?_api=DataManage.queryThroughView&_mock=false&_csrf_token=***&_locale_time_zone_offset=28800000&searchField=%5B%5D&pageSize=50&currentPage=1&page=1&limit=50&manageUuid=FORM-***&appType=APP_MAAH47PDBDYNVWONJDU1&formUuid=FORM-***&associatedFormInstId=&associatedFormUuid=&allText=&viewUuid=VIEW-***&filterRule=%7B%22condition%22%3A%22%22%2C%22rules%22%3A%5B%5D%7D&sort=%5B%5D&manageScene=WORKBENCH&subTableLimit=10&logicOperator=&_stamp=***'; 2 3// 定义分页参数 4const pageSize = 50; 5const totalCount = 1674; // 从你的响应中获取 6const totalPages = Math.ceil(totalCount / pageSize); 7const allData = []; 8 9console.log(`总数据量: ${totalCount} 条. 总页数: ${totalPages} 页. 开始抓取...`); 10 11async function fetchAllData() { 12 for (let page = 1; page <= totalPages; page++) { 13 // 1. 构建每页的 URL 14 const pageUrl = baseUrl 15 .replace(/currentPage=\d+/g, `currentPage=${page}`) 16 .replace(/page=\d+/g, `page=${page}`); 17 18 console.log(`正在请求第 ${page} 页...`); 19 20 try { 21 // 2. 发送请求 22 const response = await fetch(pageUrl); 23 const json = await response.json(); 24 25 // 3. 检查并存储数据 26 if (json.success && json.content && json.content.values) { 27 allData.push(...json.content.values); 28 console.log(`第 ${page} 页成功,已收集 ${allData.length} 条数据。`); 29 } else { 30 console.error(`第 ${page} 页请求成功,但数据结构错误或无数据。`, json); 31 // 遇到错误,可以选择 break; 或 continue; 32 } 33 34 // ⚠️ 增加延迟防止被服务器限流 (可选,但推荐) 35 await new Promise(resolve => setTimeout(resolve, 500)); 36 37 } catch (error) { 38 console.error(`请求第 ${page} 页失败:`, error); 39 // 遇到错误,可以选择 break; 或 continue; 40 await new Promise(resolve => setTimeout(resolve, 2000)); // 错误时等待更久 41 } 42 } 43 44 console.log("======================================="); 45 console.log(`✅ 所有数据抓取完成! 总计: ${allData.length} 条.`); 46 47 // 4. 将最终数据对象打印出来,方便复制 48 console.log("最终数据对象:", allData); 49 50 return allData; 51} 52 53// 运行函数 54fetchAllData(); 抓取完后就得到了 JSON 格式的所有数据,直接复制出来(虽然人类可读性极差)。 ...

January 10, 2026 · 2 min · 240 words

题解:P13883 [蓝桥杯 2023 省 Java A] 太阳

太阳好闪,拜谢太阳! 感觉我的做法有点复杂了,如果有更优的做法欢迎教我。 考虑纵坐标高的线段可能会遮挡底下的线段,因此我们从高到低排序所有线段后依次考虑所有线段。 考虑一条线段能被照射到,当且仅当太阳到它两个端点之间存在某处不存在线段遮挡。维护每条线段的两端点到太阳和纵轴的直线的斜率的倒数(为啥要维护这东西呢,因为从左往右这东西也是递增的,方便维护,可以看作一个带方向的 $\tan$)。 显然如果区间里存在某个斜率倒数值还没被覆盖到那么这个区间可以被照到。 问题是直接维护小数区间容易有精度误差,不好维护,考虑离散化后上线段树,某个位置为 $0$ 或 $1$ 表示是否被线段覆盖到。 然后支持区间推平和查询是否有还没被覆盖的点即可。查询可以通过维护区间 $\min$ 解决。 一个要注意的点是,要求照射到的面积大于 $0$ 才算被照射到,因此只照射到一个点是不行的。可以通过半开半闭地维护线段树来解决这个问题(这样维护的东西可以看作是两点之间的段,而不再是一个个单独的点了)。 另外,对于每条线段的两个端点在离散化后都有可能扔进线段树,所以线段树要开到八倍空间。 代码: 1#include<bits/stdc++.h> 2using namespace std; 3#define ll long long 4#define up(l,r,i) for(int i=(l);(i)<=(r);++i) 5#define pb push_back 6#define all(x) x.begin(),x.end() 7 8void ios_optimize(){ios::sync_with_stdio(0);cin.tie(0);} 9ll ls(ll u){return u<<1;} 10ll rs(ll u){return u<<1|1;} 11 12constexpr int N=2e5+9; 13 14ll n,X,Y,ans; 15 16struct seg{ 17 ll x,y,l; 18 friend bool operator <(seg a,seg b){ 19 return a.y>b.y; 20 } 21}a[N]; 22 23vector<long double> v,p; 24 25int tr[N*4],tag[N*4]; 26 27void pushup(int u){ 28 tr[u]=min(tr[ls(u)],tr[rs(u)]); 29} 30 31void build(int u,int l,int r){ 32 tag[u]=0;tr[u]=0; 33 if(l==r) return; 34 int mid=(l+r)>>1; 35 build(ls(u),l,mid); 36 build(rs(u),mid+1,r); 37 pushup(u); 38} 39 40void pushdown(int u){ 41 if(tag[u]){ 42 tag[ls(u)]=tag[rs(u)]=1; 43 tr[ls(u)]=tr[rs(u)]=1; 44 tag[u]=0; 45 } 46} 47 48void update(int u,int l,int r,int L,int R){ 49 if(L<=l&&r<=R){ 50 tr[u]=1;tag[u]=1; 51 return; 52 } 53 pushdown(u); 54 int mid=(l+r)>>1; 55 if(L<=mid) update(ls(u),l,mid,L,R); 56 if(R>mid) update(rs(u),mid+1,r,L,R); 57 pushup(u); 58} 59 60bool query(int u,int l,int r,int L,int R){ 61 if(L<=l&&r<=R) return tr[u]; 62 pushdown(u); 63 int mid=(l+r)>>1; 64 bool res=1; 65 if(L<=mid)res&=query(ls(u),l,mid,L,R); 66 if(R>mid)res&=query(rs(u),mid+1,r,L,R); 67 return res; 68} 69 70int main() 71{ 72 ios_optimize(); 73 cin>>n>>X>>Y; 74 up(1,n,i){ 75 cin>>a[i].x>>a[i].y>>a[i].l; 76 } 77 sort(a+1,a+n+1); 78 up(1,n,i){ 79 v.pb((long double)(a[i].x-X)/(long double)(Y-a[i].y)); 80 v.pb((long double)(a[i].x+a[i].l-X)/(long double)(Y-a[i].y)); 81 } 82 p=v;sort(all(p)); 83 p.erase(unique(all(p)),p.end()); 84 for(auto &x:v)x=lower_bound(all(p),x)-p.begin()+1; 85 build(1,1,n*2); 86 up(1,n,i){ 87 int l=v[(i-1)*2],r=v[(i-1)*2+1]; 88 if(!query(1,1,n*2,l,r-1)){ 89 ++ans; 90 update(1,1,n*2,l,r-1); 91 } 92 } 93 cout<<ans; 94 return 0; 95}

January 10, 2026 · 2 min · 240 words

My First Post

Hello,World! 这是一个行内公式: $O(n \log n)$ $qwq$ 这是一个行间公式: $$ \sum_{i=1}^{n} i = \frac{n(n+1)}{2} $$

December 20, 2025 · 1 min · 13 words