记些东西

1、写FFT时需要对N位二进制翻转,我一直都是开一个rev数组预处理来搞的,如下

  for (N=2, M=1;N<(n+m);N<<=1, M++);
  for (i=0;i<N;i++){
  	int len=0;
  	for (j=i;j>0;j>>=1) dig[len++]=(j&1);
  	for (j=0;j<M;j++) rev[i]=( (rev[i]<<1)|dig[j] );
  }

如果一个程序里需要进行多个不同长度的FFT,每次都预处理的话程序不免变得冗长。

今天学了一个很叼的方法。虽然乍一看一点都不懂,但实际上就是模拟倒着给最高位+1并进位给低位的过程,如下:

  for (int i=1,j=0;i<N-1;i++){
    for (int s=N; (~j) & s;j^=(s>>=1));
    if (i>j) swap(A[i], A[j]);
  }

(感觉FFT变得美观多了 得意

2、做题时看到的,询问有n个节点的环大小为k的独立集的个数。

先把环搞成链。考虑选出k个点后,在每个点之前放一个空点,这样一定是合法的(头和尾不会同时被选)。去除要加的k个空点,一共有n-k个点可以选择。发案数为C(n-k,k)

不过我们发现这样选出的独立集一定不会覆盖到第一个点(拉成链后的第一个点)。强行把第一个点加进去微笑

注意到此时最后一个点是不能选的,供选择的点一共有:n-1-1-(k-1) = n-k-1,我们要从中选择出k-1个点,这部分方案数为C(n-k-1,k-1)

所以我们得出公式,n个节点的环大小为k的独立集的个数为  C(n-k,k)+C(n-k-1,k-1)

好吧,我承认用dp做法也很简单。。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现万年历的宜忌功能,需要先准备好宜忌数据。这里提供一个简单的实现: ```javascript const yijiData = { "1": { "1": "祭祀,搬家,结婚,入宅,开市,订婚,纳采,裁衣", "2": "进人口,安葬" }, "2": { "1": "祭祀,开光,求嗣,解除,伐木,拆卸,修造,栽种,纳畜,安葬", "2": "嫁娶,进人口,移徙,出火,入宅,开市,立券,赴任" }, "3": { "1": "祭祀,求医,治病,开仓,出货财,安葬", "2": "嫁娶,出行,动土,开市,修造,上梁,入宅,移徙,栽种" }, // ... 其他月份的数据 }; const jiriData = { "1": "日值神煞:天赦 喜神 阴德 官日", "2": "日值神煞:月德合 天恩 月恩 玉堂", "3": "日值神煞:月德合 天恩 月恩 玉堂", // ... 其他日期的数据 }; ``` 然后,在 `getCalendar()` 函数中,可以添加宜忌数据的处理: ```javascript function getCalendar(year, month) { const daysInMonth = getDaysInMonth(year, month); const firstDayOfWeek = getDayOfWeek(year, month, 1); const calendar = []; let week = [null, null, null, null, null, null, null]; for (let day = 1, i = 0; day <= daysInMonth; day++, i++) { const jiri = jiriData[day]; // 获取日值信息 const yiji = yijiData[month][day]; // 获取宜数据 const jiji = yijiData[month][day + 15]; // 获取忌数据 week[i] = { day, jiri, yiji, jiji }; // 把数据添加到每个日期对象中 if (getDayOfWeek(year, month, day) === "六" || day === daysInMonth) { calendar.push(week); week = [null, null, null, null, null, null, null]; i = -1; } } return { calendar, firstDayOfWeek }; } ``` 最后,在 `createCalendarTable()` 函数中,将宜忌数据添加到表格中: ```javascript function createCalendarTable(year, month) { const { calendar, firstDayOfWeek } = getCalendar(year, month); let table = "<table>"; table += "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>"; for (let week of calendar) { table += "<tr>"; for (let day of week) { if (day === null) { table += "<td></td>"; } else { table += ` <td> <div class="day">${day.day}</div> <div class="jiri">${day.jiri}</div> <div class="yiji">${day.yiji}</div> <div class="jiji">${day.jiji}</div> </td> `; } } table += "</tr>"; } table += "</table>"; return table; } ``` 这样就可以在表格中显示每个日期对应的宜忌了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值