洛谷P2396 yyy loves Maths VII

P2396 yyy loves Maths VII

题目背景

yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字"

题目描述

一群同学在和yyy玩一个游戏

每次,他们会给yyy n张卡片,卡片上有数字,所有的数字都是"幸运数字",我们认为第i张卡片上数字是ai

每次yyy可以选择向前走ai步并且丢掉第i张卡片

当他手上没有卡片的时候他就赢了

但是呢,大家对"厄运数字"的位置布置下了陷阱,如果yyy停在这个格子上,那么他就输了

(注意:即使到了终点,但是这个位置是厄运数字,那么也输了)

现在,有些同学开始问:

yyy有多大的概率会赢呢?

大家觉得这是个好问题

有人立即让yyy写个程序

"电脑运行速度很快!24的阶乘也不过就620448401733239439360000,yyy你快写个程序来算一算"

yyy表示很无语,他表示他不想算概率,最多算算赢的方案数,而且是%1,000,000,007以后的值

大家都不会写程序,只好妥协

但是这时候yyy为难了,24!太大了,要跑好长时间.

他时间严重不够!需要你的帮助!

由于yyy人格分裂,某个数字可能既属于幸运数字又属于厄运数字。

输入输出格式

输入格式:

第一行n

下面一行n张卡片

第三行m 表示yyy的厄运数字个数(最多2个)

最后一行是m个厄运数字

输出格式:

方案数%1,000,000,007

输入输出样例

输入样例#1: 
8
1 3 1 5 2 2 2 3
0
输出样例#1: 
40320
输入样例#2: 
24
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2
10 15
输出样例#2: 
0

说明

数据范围:

10%的数据n<=10

50%的数据n<=23

100%的数据n<=24

 

sol:这样的数据范围,感觉不是爆搜,状压dp无疑

dp[z]表示状态为z时没有厄运数字的方案数

转移较易:枚举一个在集合z中的数字i,dp[z]+=dp[z^i]

注意判断Dis,即一个集合z的距离和Dis[z]为厄运数字,那么不能进行转移

要用lowbit进行帮助转移

lowbit(x)表示一个数在二进制意义下第一位非0的数位 可以帮助枚举一个集合,比(1~n)要快

register帮助卡常

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0'); return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=(1<<24)+5,Mod=1000000007;
int n,m,B1,B2,Dis[N],dp[N];
#define lowbit(x) ((x)&(-x))
int main()
{
    register int i,j;
    R(n);
    for(i=1;i<=n;i++) R(Dis[1<<(i-1)]);
    R(m);
    if(m>0) R(B1); if(m>1) R(B2);
    dp[0]=1;
    for(i=1;i<(1<<n);i++)
    {
        Dis[i]=Dis[i^(lowbit(i))]+Dis[lowbit(i)];
        if(Dis[i]==B1||Dis[i]==B2) continue;
        for(j=i;j;j^=lowbit(j))
        {
            dp[i]+=dp[i^lowbit(j)];
            dp[i]-=(dp[i]>=Mod)?Mod:0;
        }
    }
    Wl(dp[(1<<n)-1]);
    return 0;
}
/*
input
8
1 3 1 5 2 2 2 3
0
output
40320

input
24
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2
10 15
output
0
*/
View Code

 

转载于:https://www.cnblogs.com/gaojunonly1/p/10574649.html

在TouchDesigner中,你可以使用CHOP(通道操作)节点中的LFO(低频振荡器)和Maths(数学)节点来控制图像。以下是一个简单的例子: 1. 创建一个Movie File In节点,将其命名为“movie_in”。 2. 将Movie File In节点的输出连接到一个常规的TOP(图像处理)节点。 3. 创建一个LFO CHOP节点,并将其命名为“lfo”。 4. 在LFO CHOP节点的参数页面上,设置“Frequency”参数为适当的值,以控制LFO的速度。 5. 创建一个Maths CHOP节点,并将其命名为“maths”。 6. 在Maths CHOP节点的参数页面上,选择“Add”操作,并将其输入连接到“lfo”节点的输出。 7. 在Maths CHOP节点的参数页面上,设置“Value 1”参数为1,以控制LFO的振幅。 8. 创建一个Constant CHOP节点,并将其命名为“constant”。 9. 在Constant CHOP节点的参数页面上,设置“Value”参数为0.5,以控制图像的亮度。 10. 创建一个Maths CHOP节点,并将其命名为“maths2”。 11. 在Maths CHOP节点的参数页面上,选择“Multiply”操作,并将其输入连接到“constant”节点的输出。 12. 将“maths”节点的输出连接到“maths2”节点的第一个输入。 13. 将TOP节点的亮度参数连接到“maths2”节点的输出。 现在,你可以控制图像的亮度,以及LFO的速度和振幅,来创建一个动态的图像效果。你可以通过调整LFO节点和Maths节点的参数来实现不同的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值