Brute-force Algorithm

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2740    Accepted Submission(s): 728

Problem Description
Professor
Brute is not good at algorithm design. Once he was asked to solve a
path finding problem. He worked on it for several days and finally came
up with the following algorithm:

Any
fool but Brute knows that the function “funny” will be called too many
times. Brute wants to investigate the number of times the function will
be called, but he is too lazy to do it.

Now your task is to
calculate how many times the function “funny” will be called, for the
given a, b and n. Because the answer may be too large, you should output
the answer module by P.
 
Input
There are multiple test cases. The first line of the input contains an integer T, meaning the number of the test cases.

For each test cases, there are four integers a, b, P and n in a single line.
You can assume that 1≤n≤1000000000, 1≤P≤1000000, 0≤a, b<1000000.
 
Output
For each test case, output the answer with case number in a single line.
 
Sample Input
3
3 4 10 3
4 5 13 5
3 2 19 100
 Sample Output
Case #1: 2
Case #2: 11
Case #3: 12
 思路:a的指数和b的指数是斐波数列,所以按照指数来,然后当指数小于p时直接快速幂,否则矩阵快速幂,加上oula降幂,前面小于p直接快速幂,也保证了后面使用欧拉降幂的条件。
  1  #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<math.h>
8 using namespace std;
9 typedef long long LL;
10 typedef struct node
11 {
12 LL m[4][4];
13 node()
14 {
15 memset(m,0,sizeof(m));
16 }
17 } maxtr;
18 int f1[1000];
19 int f2[1000];
20 maxtr E();
21 void Init(maxtr *q);
22 maxtr quick_m(maxtr ans,LL n,LL mod);
23 LL quick(LL n,LL m,LL mod);
24 bool prime[1000005];
25 int aa[1000005];
26 int oula[1000005];
27
28 int main(void)
29 {
30 int T;
31 int __ca = 0;
32 int i,j;
33 int k1,k2;
34 f1[2] = 0;
35 f1[3] = 1;
36 f2[2] = 1;
37 f2[3] = 1;
38 for(i = 2; i < 1000; i++)
39 {
40 for(j = i; (i*j) <= 1000000; j++)
41 {
42 prime[i*j] = true;
43 }
44 }
45 int cn = 0;
46 for(i = 2; i <= 1000000; i++)
47 {
48 oula[i] =i;
49 if(!prime[i])
50 aa[cn++] = i;
51 }
52 for(i = 0; i < cn; i++)
53 {
54 for(j = 1; (j*aa[i])<=1000000; j++)
55 {
56 oula[j*aa[i]]/=aa[i];
57 oula[j*aa[i]]*=(aa[i]-1);
58 }
59 }
60 for(i = 4;; i++)
61 {
62 f1[i] = f1[i-1]+f1[i-2];
63 if(f1[i] > 1000000)
64 {
65 k1 = i;
66 break;
67 }
68 }
69 for(i = 4;; i++)
70 {
71 f2[i] = f2[i-1] + f2[i-2];
72 if(f2[i] > 1000000)
73 {
74 k2 = i;
75 break;
76 }
77 }
78 k1=max(k1,k2);
79 scanf("%d",&T);
80 while(T--)
81 {
82 __ca++;
83 LL n,p,a,b;
84 scanf("%lld %lld %lld %lld",&a,&b,&p,&n);
85 printf("Case #%d: ",__ca);
86 if(n==1)
87 {
88 printf("%lld\n",a%p);
89 }
90 else if(n == 2)
91 {
92 printf("%lld\n",b%p);
93 }
94 else if(n == 3)
95 {
96 printf("%lld\n",a*b%p);
97 }
98 else if(n<=k1)
99 {
100 int x1 = f1[n];
101 int x2 = f2[n];
102 LL ask = quick(a,x1,p);
103 LL ack = quick(b,x2,p);
104 printf("%lld\n",ask*ack%p);
105 }
106 else
107 {
108 if(p==1)printf("0\n");
109 else
110 {
111 maxtr cc ;
112 Init(&cc);
113 cc = quick_m(cc,n-3,oula[p]);
114 LL xx = cc.m[0][0] +cc.m[0][1];
115 LL yy = cc.m[1][0] + cc.m[1][1];
116 LL ask = quick(a,yy+oula[p],p)*quick(b,xx+oula[p],p)%p;
117 printf("%lld\n",ask);
118 }
119 }
120 }
121 return 0;
122 }
123 maxtr E()
124 {
125 maxtr e;
126 for(int i = 0; i < 4; i++)
127 {
128 for(int j = 0; j < 4; j++)
129 {
130 if(i == j)
131 e.m[i][j] = 1;
132 }
133 }
134 return e;
135 }
136 void Init(maxtr *q)
137 {
138 q->m[0][0] = 1;
139 q->m[0][1] = 1;
140 q->m[1][0] = 1;
141 q->m[1][1] = 0;
142 }
143 maxtr quick_m(maxtr ans,LL n,LL mod)
144 {
145 int i,j,s;
146 maxtr ak = E();
147 while(n)
148 {
149 if(n&1)
150 {
151 maxtr c;
152 for(i = 0; i < 2; i++)
153 {
154 for(j = 0; j < 2; j++)
155 {
156 for(s = 0; s < 2; s++)
157 {
158 c.m[i][j] = c.m[i][j] + ans.m[i][s]*ak.m[s][j]%mod;
159 c.m[i][j]%=mod;
160 }
161 }
162 }
163 ak = c;
164 }
165 maxtr d;
166 for(i = 0; i < 2; i++)
167 {
168 for(j = 0; j < 2; j++)
169 {
170 for(s= 0; s < 2; s++)
171 {
172 d.m[i][j] = d.m[i][j] + ans.m[i][s]*ans.m[s][j]%mod;
173 d.m[i][j]%=mod;
174 }
175 }
176 }
177 ans = d;
178 n>>=1;
179 }
180 return ak;
181 }
182 LL quick(LL n,LL m,LL mod)
183 {
184 LL ak = 1;
185 while(m)
186 {
187 if(m&1)
188 ak = ak*n%mod;
189 n = n*n%mod;
190 m>>=1;
191 }
192 return ak;
193 }

Brute-force Algorithm(hdu3221)的更多相关文章

  1. SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12581 Burte Force 算法,求解了所有了情况,注意  ...

  2. Test SRM Level Three: LargestCircle, Brute Force

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3005&rd=5858 思路: 如果直接用Brute F ...

  3. 常用字符串匹配算法(brute force, kmp, sunday)

    1. 暴力解法 // 暴力求解 int Idx(string S, string T){ // 返回第一个匹配元素的位置,若没有匹配的子串,则返回-1 int S_size = S.length(); ...

  4. 小白日记46:kali渗透测试之Web渗透-SqlMap自动注入(四)-sqlmap参数详解- Enumeration,Brute force,UDF injection,File system,OS,Windows Registry,General,Miscellaneous

    sqlmap自动注入 Enumeration[数据枚举] --privileges -U username[CU 当前账号] -D dvwa -T users -C user --columns  [ ...

  5. nginx 1.3.9/1.4.0 x86 Brute Force Remote Exploit

    测试方法: 本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! #nginx 1.3.9/1.4.0 x86 brute force remote exploit # copyri ...

  6. 安全性测试入门:DVWA系列研究(一):Brute Force暴力破解攻击和防御

    写在篇头: 随着国内的互联网产业日臻成熟,软件质量的要求越来越高,对测试团队和测试工程师提出了种种新的挑战. 传统的行业现象是90%的测试工程师被堆积在基本的功能.系统.黑盒测试,但是随着软件测试整体 ...

  7. HDU 6215 Brute Force Sorting(模拟链表 思维)

    Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  8. hdu6215 Brute Force Sorting

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6215 题目: Brute Force Sorting Time Limit: 1000/100 ...

  9. HDU - 6215 2017 ACM/ICPC Asia Regional Qingdao Online J - Brute Force Sorting

    Brute Force Sorting Time Limit: 1 Sec  Memory Limit: 128 MB 题目连接 http://acm.hdu.edu.cn/showproblem.p ...

  10. 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)

    题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...

随机推荐

  1. 深入浅出KMP

    前言:曾经有次在阿里的面试中遇到这个基础的问题,当时知道有这么回事,可是时间久了便 想不起来,可能是不怎么用到,基本调用库什么的,还有个是理解不深刻,不能得到show me the code 的程度, ...

  2. 巩固javaweb的第二十二天

    巩固内容: 使用表单数据 : 要对用户输入的信息进行验证,需要先获取输入信息.每个表单元素都属于一个 form 表单,要获取信息,需要先获取 form,然后访问表单元素的值. 有两种方式可以获取 fo ...

  3. 1小时学会Git玩转GitHub

    版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 本次教程建议一边阅读一边用电脑实操 目录 一.了解Git和Github 1.1 什么是Git 1.2 什么是版本控制系统 1.3 什么是Github ...

  4. 18. MYSQL 字符编码配置

    MYSQL 5.7版本的my.ini 在C盘隐藏文件夹下 C:\ProgramData\MySQL\MySQL Server 5.7 [client] default-character-set=ut ...

  5. 在JTable单元格上 加入组件,并赋予可编辑能力 [转]

    表格(单元格放置组件) 对于JTable单元格的渲染主要是通过两个接口来实现的,一个是TableCellRenderer另一个是TableCellEditor,JTable默认是用的是DefaultC ...

  6. 【Linux】【Shell】【Basic】变量与数据类型

    1. 变量: 1.1. 局部变量:作用域是函数的生命周期:在函数结束时被自动销毁: 定义局部变量的方法:local VARIABLE=VALUE 1.2. 本地变量:作用域是运行脚本的shell进程的 ...

  7. Java文件操作(求各专业第一名的学生)

    两个文件:info.txt 存放学生基本信息 学号 学院 专业 姓名 1001 计算机学院 软件工程 刘月 1002 生物工程 服装设计 孙丽 score.txt存放分数信息 学号 学科 成绩 100 ...

  8. shell脚本采集系统cpu、内存、磁盘、网络信息

    有不少朋友不知道如何用shell脚本采集linux系统相关信息,包括cpu.内存.磁盘.网络等信息,这里脚本小编做下讲解,大家一起来看看吧. 一.cpu信息采集 1),采集cpu使用率采集算法:通过/ ...

  9. Java Bean 与Spring Bean 的区别

    什么是JavaBean: JavaBean是一种JAVA语言写的可重用组件.JavaBean符合一定规范写的Java类,是一种规范.它的方法命名,构造以及行为必须符合特定的要求:     1.所有属性 ...

  10. Redis-5种基础数据结构

    Redis基础数据结构 知识整理源于<Redis深度历险 核心原理与应用实践>这本书 Redis 有的数据结构都以 唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 ...