[杂题]CSUOJ1413 Area of a Fractal

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1413

题意:题中给了图,所以不看字大概也知道

    求的是第n个图形的面积。

就是找规律 递推 一类的...

先给结论:

很鬼畜的公式:    

递推式是:  

重点在于17和7是怎么来的。

在题图的基础上画些个框框

观察可以发现 图1中的 1*1的方格变成了图2中*的方格

    其中17就是4*4+1*1

所以第二个方格的面积为前一个方格的17倍。

显然17倍了之后还不是该图形的面积,因为有(灰格子)的面积少了。

数一下就会发现4个拐中的每个拐都缺了7块

就这样 神奇的7和17都得到了。。。

然后解啊解啊就能解出那个鬼畜的公式了。

有了公式这题就很简单了

只需要用ex_gcd求出5的逆元,然后套一套公式,模一模就完成了~

代码:

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <climits>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <string>
 8 #include <sstream>
 9 #include <iostream>
10 #include <algorithm>
11 #include <iomanip>
12 using namespace std;
13 #include <queue>
14 #include <stack>
15 #include <vector>
16 #include <deque>
17 #include <set>
18 #include <map>
19 typedef long long LL;
20 typedef long double LD;
21 const double pi=acos(-1.0);
22 const double eps=1e-6;
23 #define INF 0x3f3f3f
24 #define lson l, m, rt<<1
25 #define rson m+1, r, rt<<1|1
26 typedef pair<int, int> PI;
27 typedef pair<int, PI > PP;
28 #ifdef _WIN32
29 #define LLD "%I64d"
30 #else
31 #define LLD "%lld"
32 #endif
33 //#pragma comment(linker, "/STACK:1024000000,1024000000")
34 //LL quick(LL a, LL b){LL ans=1;while(b){if(b & 1)ans*=a;a=a*a;b>>=1;}return ans;}
35 //inline int read(){char ch=‘ ‘;int ans=0;while(ch<‘0‘ || ch>‘9‘)ch=getchar();while(ch<=‘9‘ && ch>=‘0‘){ans=ans*10+ch-‘0‘;ch=getchar();}return ans;}
36 inline void print(LL x){printf(LLD, x);puts("");}
37 //inline void read(LL &ret){char c;int sgn;LL bit=0.1;if(c=getchar(),c==EOF) return ;while(c!=‘-‘&&c!=‘.‘&&(c<‘0‘||c>‘9‘)) c=getchar();sgn=(c==‘-‘)?-1:1;ret=(c==‘-‘)?0:(c-‘0‘);while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret=ret*10+(c-‘0‘);if(c==‘ ‘||c==‘\n‘){ ret*=sgn; return ; }while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret+=(c-‘0‘)*bit,bit/=10;ret*=sgn;}
38 const int mod=1000000007;
39
40 LL quick(LL a, LL b)
41 {
42     LL ans=1;
43     while(b)
44     {
45         if(b & 1)ans=(ans*a)%mod;
46         a=(a*a)%mod;
47         b>>=1;
48     }
49     return ans%mod;
50 }
51
52 void ex_gcd(int a, int b, int &x, int &y)
53 {
54     if(b)
55     {
56         ex_gcd(b, a%b, x, y);
57         int tmp=x;
58         x=y;
59         y=tmp-(a/b)*y;
60     }
61     else
62     {
63         x=1, y=0;
64         return ;
65     }
66 }
67 int main()
68 {
69     int t;
70     scanf("%d", &t);
71     while(t--)
72     {
73         int n;
74         scanf("%d", &n);
75         if(n==0)
76         {
77             printf("1\n");
78             continue;
79         }
80         int x, y;
81         ex_gcd(5, mod, x, y);
82         print((((3*quick(17, n))%mod+(2*quick(7, n))%mod)*x)%mod);
83     }
84     return 0;
85 }

CSUOJ 1413

时间: 2024-10-08 15:31:21

[杂题]CSUOJ1413 Area of a Fractal的相关文章

【最小生成树杂题】

这里谈一下最小生成树 生成树的概念:连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树.生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.常用于求最小生成树得算法包括kruskal(克鲁斯卡尔)算法或Prim(

_杂题_

杂题集 是个放题的好地方! **** 5.28 **** - BZOJ [3052] 糖果公园 - 据说是一道区间操作的综合题,但现在貌似蹦了? 现在还是太水,之后再来写吧. *************

[杂题]URAL1822. Hugo II&#39;s War

看懂题意的请直接跳过下一坨! 本人有表达障碍! ========================================== 题意: (题意真的很难很难懂啊!!!  去他娘的**) 有一个王国,王国里有一个国王(编号为1),他有(编号为2~n) n-1个臣子(这些臣子并不全和他有直接关系) 然后呢 国王要去打架,但是只有当他的x%个及以上的直系下属(与他有直接关系的臣子)做好打架的准备了,他才能去打架 他的直系下属也有下属,也要其中x%及以上的下属做好打架准备了,那些直系下属才会开始准备

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

hdu 4961 数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=4961 先贴个O(nsqrtn)求1-n所有数的所有约数的代码: vector<int>divs[MAXN]; void caldivs() { for(int i=1;i<MAXN;i++) for(int j=i;j<MAXN;j+=i) divs[j].push_back(i); } 有了这个当时理下思路就可写了,但是重复数处理注意: 1.用一个数组vis[]  vis[i]=1表示i存在

poj 杂题 - 1959 Darts

这一题放在杂题里,是因为我没有用DP,而是使用的枚举,当然是受到了discuss里面的启发. 因为我们只能有三次机会,每一次只可以是固定的63个数,所以枚举感觉更加直观,但是不知道是不是没有DP快. #include<stdio.h> #include<string.h> int n; int Darts[63]; int main(){ int t,c=1,i,j,k,res; scanf("%d",&t); for(i = 0 ;i<=20;i

poj 杂题 - 2081 Recaman&#39;s Sequence

这道题目一开始就能知道考点在如何缩短查找时间.所以加快查找是我们的重点.但是在大数据面前,查找算法都不够快,所以我们用简单的hash思想来做. 我们开一个数组a,当出现了一个数b时,把该数作为下标调整值,即a[b] = -1,下一次出现该值的时候直接去找这个值作为下标的a值是否为-1即可. #include<stdio.h> #include<string.h> #define MAX 5000010 int p[MAX]={0}; int s[MAX]={0}; int main

杂题选录

LuoguP3948数据结构 10-20 是比较裸的差分题目,但是要注意在线查询的时候开始傻了,每次都暴力地从1到n搞一遍,还存在数组中每次都要清空...结果T了很多点. 其实在线查询的时候直接用变量+扫到r就行了. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 5 using namespace std; 6 typedef long long ll; 7 8 int n,opt,tot,

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.