码迷,mamicode.com
首页 > 其他好文 > 详细

八校联考第二场(二试)(20170924)

时间:2017-09-24 20:20:25      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:min   print   name   名称   amp   perm   数列   mod   时间   

NOIP 信心赛
zzq
题目名称函数排列数字串
代码文件名func perm num
输入文件名func.in perm.in num.in
输出文件名func.out perm.out num.out
时间限制1s 2s 2s
空间限制512MB 512MB 512MB
子任务分值10 20 30 40 10 20 20 10 40 20 30 30 20
题目类型传统传统传统
比较方式全文比较(忽略行末
空格和文末换行)
全文比较(忽略行末
空格和文末换行)
全文比较(忽略行末
空格和文末换行)
1. 题目难度和顺序大致相关。
2. 这套题采用子任务制,通过一个子任务中的全部点才能获得对应分值。
3. 评测环境为Win7+Lemon。
4. 开启O2 优化,栈空间开大至256MB。
5. 666623333 是一个质数。
函数(func)
题目描述
很久以前,有一个神秘的整数函数f(x),它是[l,r]的整数到[l,r]的整数的双射。
在岁月中,这个函数早已被遗忘,人们记得的只有对于每个[l,r]中的整数x,
这个函数满足f(f(x))=-x。
现在,你想要知道满足条件的函数有多少种,mod 666623333 输出。
两个函数f1,f2 不同当且仅当存在定义域中的一个数a,f1(a)≠f2(a)。函数双
射的意思是定义域和值域一一对应。
输入格式
一行两个整数l,r。
输出格式
一个整数,满足条件的函数个数mod 666623333。
样例输入
-2 2
样例输出
2
样例解释
有两个函数满足题意,f(-2)、f(-1)、f(0)、f(1)、f(2)分别为1、-2、0、2、-1 和
-1、2、0、-2、1。
子任务
子任务1:-3<=l<=r<=3,10 分。
子任务2:-10<=l<=r<=10,20 分。
子任务3:-100<=l<=r<=100,30 分。
子任务4:-10^7<=l<=r<=10^7,40 分。
排列(perm)
题目描述
很久以前,有一个1~n 的排列。
这个排列太杂乱无章了,方老师想要让它变得单调一些。方老师打算把排列
中的数划分成两个非空子序列,一个单调上升,一个单调下降。
需要注意的是,排列中的每个数必须恰在一个子序列中并保持原来在排列中
的相对顺序不变。
由于方案可能会比较多,你只需要输出方案数mod 666623333。
输入格式
第一行一个整数n。
第二行n 个1~n 的整数,为一个1~n 的排列。
输出格式
一个整数,满足题意的方案数mod 666623333。
样例输入
3
1 3 2
样例输出
3
样例解释
3 种方案的上升序列和下降序列分别为{1}{3,2},{1,3}{2}和{1,2}{3}。
子任务
子任务1:1<=n<=10,10 分。
子任务2:1<=n<=300,20 分。
子任务3:1<=n<=5000,20 分。
子任务4:1<=n<=10^6 且排列随机,10 分。
子任务5:1<=n<=10^6,40 分。
数字串(num)
题目描述
小学生zzq 学习了平方数的概念之后,定义了一个新的概念平方串。
我们定义一个串为平方串当且仅当这个串非空而且它可以由两个相同串连
接而成。例如naivenaive 和aaaaaa 为平方串,而naiveevian 和aaaaa 不是。
现在zzq 拿到了一个很长的数字串(每个字符为0~9),他想要随机地取出一
个非空子串,如果这个子串没有前导零且为平方串,那么它的价值就为它的数
值,否则它的价值为0。例如015 和233 的价值为0,1515 的价值为1515。
zzq 想知道他取出子串价值的期望,mod 666623333 输出。
如果答案是一个分数p/q,你需要输出一个数x 使得qx≡p(mod 666623333)。
输入格式
一行一个数字串。
输出格式
一个整数,取出子串价值的期望mod 666623333。
样例输入
01101100
样例输出
592557133
样例解释
有三个子串价值非0,分别为”11”、”11”、”110110”,总共有36 种选择子串
的方案,所以子串价值的期望为(11+11+110110)/36=110132/36≡592557133。
子任务
令数字串长度为n。
子任务1:1<=n<=1000,20 分。
子任务2:1<=n<=500000 且数字串每一位在0~9 均匀随机,30 分。
子任务3:1<=n<=50000,30 分。
子任务4:1<=n<=500000,20 分。
友情提示
由于是捆绑测试,建议不要使用自然溢出hash 等正确性不明的算法。

 

这套题目,命名为信心题,果然严重打击信心,第一道题目比较水,

然后开始看二,三题,发现第二题还是比较可以做的。然后思考,

最后只能搞了个n^2,再给我30分钟,就可以AC啊啊啊。

 

T1

就是发现一个确定f(x)=y,那么x,y,-x,-y就都搞定了,这个y可以与-y互换。

然后后面就需要考虑2的幂次,然后在求一个差为2的阶乘,发现就是分组

将n个数分成年n/2组,就可以了。

T2

可以发现,当前数列i,到i这个位置为止,i项一定为上升,或者下降的尾部,

然后n^2就出来了。fs[i][j]表示,上升i为结尾,j为下降最后,fx[i][j]表示i为下

降最后,j为上升最后,然后O(1)转移,打完代码发现,使区间加的,然后

就想到了线段树维护,然后就没时间了。

T3

20分还可以拿,其它。。。

 

T1考试代码

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #define mod 666623333
 7 #define ll long long
 8 using namespace std;
 9 
10 int l,r;
11 ll ans,res;
12 
13 ll ksm(ll a,int b)
14 {
15     ll ans=1;
16     while (b)
17     {
18         if (b&1) ans=ans*a%mod;
19         a=a*a%mod;
20         b>>=1;
21     }
22     return ans;
23 }
24 int main()
25 {
26     freopen("func.in","r",stdin);
27     freopen("func.out","w",stdout);
28     
29     scanf("%d%d",&l,&r);
30     if (l>r||(l>0&&r>0)||abs((abs(l)-abs(r)))>1)
31     {
32         printf("%d\n",0);
33         return 0;
34     }
35     int x=min(abs(l),abs(r));
36     if (x%2!=0)
37     {
38         printf("0\n");
39         return 0;
40     }
41     res=ksm(2,x/2);
42     ans=1;
43     for (int i=1;i<=x;i+=2)
44         ans=ans*i%mod;
45     ans=ans*res%mod;
46     printf("%lld",ans);
47 }

T2

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #define N 5007
 7 #define mod 666623333
 8 #define ll long long
 9 
10 using namespace std;
11 
12 int n;
13 int a[N];
14 ll fs[N][N],fx[N][N];
15 
16 int main()
17 {
18     freopen("perm.in","r",stdin);
19     freopen("perm.out","w",stdout);
20     
21     scanf("%d",&n);
22     if (n>5000)
23     {
24         cout<<0<<endl;
25         return 0;
26     }
27     for (int i=1;i<=n;i++)
28         scanf("%d",&a[i]);
29     fs[1][n+1]=fx[1][0]=1;
30     for (int i=2;i<=n;i++)
31         for (int j=0;j<=n+1;j++)
32         {
33             if (fs[i-1][j]!=0)
34             {
35                 if (a[i-1]<a[i]) fs[i][j]+=fs[i-1][j];
36                 if (j>a[i]) fx[i][a[i-1]]+=fs[i-1][j];
37             }
38             if (fx[i-1][j]!=0)
39             {
40                 if (a[i-1]>a[i]) fx[i][j]+=fx[i-1][j];
41                 if (j<a[i]) fs[i][a[i-1]]+=fx[i-1][j];
42             }
43             while (fs[i][j]>=mod) fs[i][j]-=mod;
44             while (fx[i][j]>=mod) fx[i][j]-=mod;
45         }
46     ll ans=0;
47     for (int i=0;i<=n;i++)    
48         ans=(ans+fs[n][i]+fx[n][i])%mod;
49     printf("%lld\n",ans);    
50 }

 

八校联考第二场(二试)(20170924)

标签:min   print   name   名称   amp   perm   数列   mod   时间   

原文地址:http://www.cnblogs.com/fengzhiyuan/p/7588116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!