[XJOI]noip40 T2统计方案

统计方案

小B写了一个程序,随机生成了n个正整数,分别是a[1]..a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c。但是没过多久,小B就忘记他选了哪些数,他想把所有可能的取数方案都找出来。你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模1000000007后输出。
小B记得他至少取了一个数。

输入格式:

第一行三个正整数n,p,c,含义如题目所述。
接下来一行有n个正整数,表示生成的n个随机数。

输出格式:

一个数,方案数模1000000007。

样例输入:

2 7 2

1 2

样例输出:

2

数据范围:

对于30%的数据,n ≤ 16
另有30%的数据,p ≤ 10000
对于100%的数据,n ≤ 32, p ≤ 10^9, c ≤ 10^9, a[i] < p, p是质数

解题思路:

看到这种n <=32的数据范围,其实很多大佬都可以猜到这是中途相遇法

***如果知道这个的可以跳过下面这段介绍

中途相遇法:事实上就是进行两次dfs,在第一次dfs时记录下搜索到的结果,

一般用map或者hash,然后第二次是在dfs结束时根据上一次的结果,记录答案

***然后是对于这道题的介绍

你先dfs前(n/2)个数,选或不选,结束时记录这些数的乘积a,我是用map来记录的

然后在dfs后(n/2)个数,同样是选或不选,结束时得到这些数的乘积为b

因为a*b%p=c,所以我们可以用(c/b)在%p意义下的逆元就是a的值

最后再返回到原来的map里面找

如果没看懂,可以借助程序在思考一下

***注意:(1)因为不能不取,所以在c=1的时候,答案要减一

(2)c有可能大于等于p,这种情况直接输出0

%:pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
#define czx 1000000007
using namespace std;
int ans=0,a[50],n,p,c,m;
map <int,int> mp;
int pow(int a){
    int res=1,b=p-2;
    while (b){
        if (b&1) res=(res*a)%p; b/=2; a=(a*a)%p;
    }
    return res;
}
inline void dfs(int x,int s){
    if (x==m+1){
        mp[s]++; return;
    }
    dfs(x+1,s); dfs(x+1,1ll*s*a[x]%p);
}
inline void dfs1(int x,int s){
    if (x==n+1){
        int a=c*pow(s)%p;
        ans=(ans+mp[a])%czx; return;
    }
    dfs1(x+1,s); dfs1(x+1,1ll*s*a[x]%p);
}
main(){
    scanf("%lld%lld%lld",&n,&p,&c);
    if (c>=p){
        puts("0"); return 0;
    }
    for (int i=1;i<=n;++i)
        scanf("%lld",&a[i]);
    m=n/2; dfs(1,1); dfs1(m+1,1);
    if (c==1) ans--; printf("%lld",ans);
}

最后再给上几道中途相遇法的题目

http://acm.hdu.edu.cn/showproblem.php?pid=4963

http://poj.org/problem?id=1186

时间: 2024-11-01 15:05:11

[XJOI]noip40 T2统计方案的相关文章

Nginx日志统计方案全过程

本文主要记录下给予python的nginx日志统计过程,主要原因是最近系统经常遭到未知程序的疯狂爬数据,虽然做了防爬机制,但是还是必须要找出是哪些IP访问次数比较多.想到的办法就是通过分析ngxin日志,从而找出这些IP排行即可.具体方案的操作步骤包括: ngxin日志每日切割功能: 设置ngxin的日志格式: 编写python代码在每日切割之前统计下access.log中的IP访问次数并将统计结果录入MongoDB: 编写web查询MongoDB进行统计. 一.nginx日志每日切割功能 该功

APP推广渠道下载量统计方案

经常在群里看到有人问到这个问题,所以今天把大家讨论的方案汇总说一下: 主要说Android的跟踪和iphone应用的跟踪. 1.iphone应用渠道跟踪统计如果是appstore中的iPhone应用,那么没有办法跟踪,因为各渠道推广的都是这一个包,无法区分.以前都是用时间戳记录一个udid库,然后比对,用这样的方式来比对是否是对方推广来的设备.但apple已经禁止应用程序取到udid,现在有的说是用MAC,具体的有好的方案在和大家分享 .如果是越狱版的就好解决了,每个渠道给一个加跟踪代码区分的安

C/C++应用程序内存泄漏检查统计方案

一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是托管的,C++那边也没有内存(庇护其好友),肯定是C这边的问题”(话说一个十几年的程序员还停留在语言层面不觉得有点low吗),笔者毕业不到一年,听到此语心里一万头草泥马奔腾而过,默默地修改了程序,注意不是修改bug(哈哈),而是把所有malloc和free都替换成了自定义宏MALLOC和FREE,d

CodeForces 567C Geometric Progression 类似dp的递推统计方案数

input n,k 1<=n,k<=200000 a1 a2 ... an 1<=ai<=1e9 output 数组中选三个数,且三个数的下标严格递增,凑成形如b,b*k,b*k*k的种数 做法:先将可以作为第三个数的数放到map中,然后再扫一遍依次统计map中的数作为第三个数的种数,第二个数的种数,第三个数的种数 1 #include<cstdio> 2 #include<map> 3 struct node 4 { 5 int b;//a[i]作为i1的

[XJOI]noip43 T2多人背包

多人背包 DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值.在 DD 看来,合理的背包安排方案是这样的:1. 每个人背包里装的物品的总体积恰等于包的容量. 2. 每个包里的每种物品最多只有一件,但两个不同的包中可以存在相同的物品. 3. 任意两个人,他们包里的物品清单不能完全相同. 在满足以上要求的前提下,所有包里的所有物品的总价值最大是多少呢? 输入格式: 第一行有三个整数:K

noip2011普及组T2 统计单词数(stat) KMP算法

才学了KMP,拿这题来练练手……(不过似乎有点小题大做了…… 这就是一题水水的KMP模板,匹配若干次,每一次从上次匹配后的位置开始,直到匹配失败. 虽然用的算法“高级”一点,但是居然比暴力慢了40MS啊啊啊…… Code: 1 #include<iostream> 2 using namespace std; 3 const int P=15; 4 const int S=1000005; 5 char p[P],s[S]; 6 int next[P],pl,sl; 7 void getnex

二模07day1解题报告

T1.种树(tree) 有n棵树,各有高度,要求每棵树的高度都小于它到其他树的距离(可能种一起).求砍掉的总高度是多少. Ok,那么可以想到,只要满足每棵树和最近的树满足条件就可以保证和其他树满足了.所以只要按pos排个序,去重,然后一棵一棵砍,就好了. T2.统计方案(count) 有n个数,取出一部分,相乘mod p=c,求方案树. 还是暴力求解.... 正解是非常神的.由于16的数据是可以比较快的解出来的,所以就可以把所有可能达到的值全都算出来. 然后可以用类似的办法求出另一组中的可能积b

路径方案数_mod_SPFA_记忆化搜索_C++

本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易码一些,而且跑得快一些) 话说不取模也可以A,数据太水 很水的题吧,先 SPFA 跑一遍 2 的最短路,然后记忆化搜索统计方案 不难证明在加上最短路的限制条件后,图变成了一个 DAG 证明:首先有向是显然的,不可能存在两点 x,y,它们的最短路 d[x]>d[y] 又 d[x]<d[y] 若存在一

可复用且高度解耦的iOS用户统计实现

http://www.cocoachina.com/ios/20160421/15912.html 本文为投稿文章,作者:编程小翁(简书) 用户统计 用户行为统计(User Behavior Statistics, UBS)一直是移动互联网产品中必不可少的环节,也俗称埋点.在保证移动端流量不会受较大影响的前提下,PM们总是希望埋点覆盖面越广越好.目前常规的做法是将埋点代码封装成工具类,但凡工程中需要埋点(如点击事件.页面跳转)的地方都插入埋点代码.一旦项目越来越复杂,你会发现埋点的代码散落在程序