D,只要抓住每个点只有一个出度,那么图就能分成几个部分,而且可以发现,一个部分最多一个环。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
#define LL long long
const int MAXN = 200005;
const int MOD = 1e9 + 7;
int nt[MAXN]; int two[MAXN];
int part[MAXN];
int visit[MAXN];
int acyc[MAXN], acyn[MAXN]; int n, cyc, cyn; void dfs2(int u){
visit[u] = 3;
acyc[cyc] ++;
if(visit[nt[u]] == 3) return ;
dfs2(nt[u]);
} void dfs(int u){ visit[u] = 2;
if(visit[nt[u]] == 0){
dfs(nt[u]);
}
else if(visit[nt[u]] == 1){
cyn = part[nt[u]];
// visit[nt[u]] = 1;
}
else{
cyc ++;
cyn = cyc;
dfs2(nt[u]);
}
visit[u] = 1;
part[u] = cyn;
acyn[cyn]++;
} int main(){ two[0] = 1;
for(int i =1 ; i < MAXN; i++)
two[i] = (two[i - 1] * 2) % MOD; scanf("%d", &n);
memset(visit, 0, sizeof(visit));
memset(part, -1, sizeof(part));
for(int i = 1; i <= n; i++)
scanf("%d", &nt[i]); cyc = cyn = 0; for(int i = 1; i <= n; i++){
if(visit[i] == 0){
cyn = 0;
dfs(i);
}
} int ans = 1;
/*
for(int i = 1; i <= n; i++)
printf("%d ", part[i]);
puts(""); for(int i = 0; i <= cyc; i++){
printf("%d %d \n", acyc[i], acyn[i]);
}*/ for(int i = 0; i <= cyc; i++){
if(i == 0 && acyn[i] > 0){
ans = ((LL)ans * two[acyn[i] - 1])%MOD;
}
if(i > 0){
ans = (LL)ans * (two[acyn[i]] - (LL)2 * two[acyn[i] - acyc[i]]) % MOD;
}
}
if(ans < 0) ans = ((LL)ans + MOD) % MOD; printf("%d\n", ans); return 0;
}

  

E,题解在注释

/*****************

设 2^n = m ,分母为 m ^k ,算的分子为 m * (m - 1) *.... * (m - k + 1)
只要两个互质,最后用1减就是了,至于化简的过程,就是对分子提取因子2. 边界 太多,搞了一晚……不划算 ***********/ #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring> using namespace std;
#define LL long long const int MOD =1000003; int mod[MOD + 5];
bool vis[MOD + 5]; LL tail[100]; int quick(int m, LL k){
int ret = 1;
int pow = m;
while(k){
if(k&1)
ret = (LL)ret * pow % MOD;
k >>= 1;
pow = (LL)pow * pow % MOD;
}
return ret;
} int cal(LL n, int index){ int m = quick(2, n);
int ret = 1;
int counts = 0; memset(vis, false, sizeof(vis)); for(LL i = 1; i <= tail[index]; i += 2){
if(vis[(((LL)m - i)%MOD + MOD)%MOD]){
break;
}
mod[counts++] = (((LL)m - i)%MOD + MOD) %MOD;
vis[mod[counts - 1]] = true;
} // cout << counts << endl; LL mc = tail[index] / 2 + 1;
LL cc = mc / counts; mc = mc % counts; for(int i = 0; i < counts; i++)
ret = ((LL)ret * mod[i]) % MOD; ret = quick(ret, cc);
for(int i = 0; i < mc; i++){
ret = ((LL)ret * mod[i]) %MOD;
} // cout <<"endl" << endl; return ret; } int main(){ LL n, k, tmp;
int counts = 0;
cin >> n >> k; double tt = log(k) / log(2) - n; if(n < 64){
if( tt > 1e-8){
cout << 1 << " " << 1 << endl;
return 0;
}
else if(tt < 1e-8){ LL ans = 1; for(LL i = 1; i <= n; i++)
ans = ans * 2; if(ans > 0 && ans < k){
cout << 1<< " "<< 1 << endl;
return 0;
} }
} tmp = k - 1; LL upc = 0; while(tmp){ if(tmp % 2 == 0){ upc += tmp / 2; tail[counts++] = tmp - 1;
tmp = tmp / 2;
}
else {
upc += tmp / 2;
tail[counts++] = tmp;
tmp = (tmp - 1) / 2;
} } // cout << upc << endl << endl; LL k_1 = k - 1 - upc; int down = quick(2, n - 1);
down = quick(down, k - 1);
down = (LL)down * quick(2, k_1) % MOD; int up = 1; // cout << down <<endl; // cout << "YES" << counts <<endl; for(int i = 0; i < counts; i++){
up = ((LL)up * cal(n - i, i))%MOD;
} up = ((down - up) % MOD + MOD) %MOD; cout << up <<" "<< down << endl;
}

  

CF # 369 D2 D、E的更多相关文章

  1. CF 369 B. Valera and Contest

    http://codeforces.com/contest/369/problem/B 题意 :n, k, l, r, sall, sk,n代表的是n个人,这n个人的总分是sall,每个人的得分大于 ...

  2. CF#310 d2

    A:|c[1]-c[0]| B:A+-(oc)A[0]==0..n-1 C: #include <cstdio> int n,m,i,j,k,p; int ll,ca,cb,cc; int ...

  3. CF# 368 D2 D

    很容易想到可以它操作序列弄成有向图,果断深搜.但我开始竟然用了一种特醇的方法,每个书架做一次深搜,复杂度O(nq),跑到57个test就不动了.看看代码吧 #include <iostream& ...

  4. CF #330 D2 E

    相当于给你一些点,要你最多删除不超过k,使得能使用一个边长为整数的长方形,与XY轴平行,使长方形的面积最小. 上课时拿笔来画画,然后忽然思路就开了,要是比赛也这样就好了~~先按X,Y分别排序,由于K较 ...

  5. CF #327 DIV2 D、E

    两题都不难. 对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动.假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变 ...

  6. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

  7. C、C++、Java、go的语法区别

    详细C++.Java比较:http://www.cnblogs.com/stephen-liu74/archive/2011/07/27/2118660.html 一.C.C++的区别 在很大程度上, ...

  8. CF卡技术详解——笔记

    知识太全面了,摘抄摘不完,还是粘过来加上注释和笔记吧. 重点以及断句用加粗,注释用红括号. 一.CF卡技术及规格 一.CF卡技术及规格 1.CF卡简史 随着数码产品的高速普及,近年来闪存卡也进入了高速 ...

  9. 你会用::before、::after吗

    ::before和::after伪元素的用法 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:fo ...

随机推荐

  1. Node.js——require加载规则

    判断require中的标识参数: 非路径的标识参数:也被称为是核心模块,已经被编译到二进制文件中 带有路径标识参数:自定义模块,一般都是相对定位 第三方模块:表现形式与核心模块一样,但是实际不一样,它 ...

  2. ES6扩展运算符的使用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. (转)淘淘商城系列——zookeeper单机版安装

    http://blog.csdn.net/yerenyuan_pku/article/details/72717744 这篇文章,我单独来说一下zookeeper如何安装.在实际开发中,zookeep ...

  4. Flutter web环境变量搭建及开发

    使用flutter开发app已有三个月,有一些行为形成了惯性,在搭建flutter web环境变量时走了不少的坑,分享出来,免得其他小伙伴再走一遍. 首先flutter的版本要使用1.5及以上版本 d ...

  5. 在 XML 中有 5 个预定义的实体引用

  6. 制作framework&静态库

    http://blog.csdn.net/justinjing0612/article/details/7880712     (制作framework) http://blog.sina.com.c ...

  7. 题解 洛谷P4550/BZOJ1426 【收集邮票】

    这显然是一道概率的题目(废话) 设发\(f[i]\)表示买到第\(i\)张邮票还需要购买的期望次数,\(g[i]\)表示买到第\(i\)张邮票还需要期望花费的钱. 那么答案显然为\(g[0]\),我们 ...

  8. idea导入本地idea的web项目(服务器用的是tomcat)

    开始吧!!! 点击import project. 我以SpringMVCPro3为例,选中,点击OK 点击next 继续next 随便吧,我点击yes 选中工程,点击next lib1不要钩,然后点击 ...

  9. KBE_创建项目和基本常识

    此笔记参考官方文档 第一个项目 资产库:是每一个项目文件夹的名称,使用KBE提供的生成工具生成一个最小资产库,其中包含了很多常用的工具,默认名server_assets: res:放置一些资源(入地图 ...

  10. 零基础入门学习Python(30)--文件系统:介绍一个高大上的东西

    知识点 os,os.path模块中关于文件.目录常用的函数使用方法 在使用os模块,需要先进行import操作: import os os模块中关于文件/目录常用的函数使用方法 函数名 函数作用 示例 ...