1. 程式人生 > >Codeforces —— 359C Prime Number

Codeforces —— 359C Prime Number

很有趣的一個數論題。

題目要求的是分子和分母的最大公約數,但因為x是素數,所以其實就是要將分子和分母都表示成(x^k)*m,m不能被x整除,然後取分子和分母k的最小值。

對於分母,題目已經限定好就是x^s,s=a1+a2+...+an

所以關鍵點就是處理分子那一部分。

首先對於每個1/x^ai,通分後分子的形式就是x^(s-ai),我們的任務就是要求出分子中所有項的最大公約數(就是我們要的x^k),那肯定是取次數最小的那一項了。

但由於其中某些項相加有可能是係數能被x整除,

比如2^2+2^2=2*2^2=2^3,

對於這種情況分子求出來的次數是3而不是2

所以我們還要對分子的項進行處理。

處理的方法是將相同次數的項加到一塊,這裡我用map處理

然後每次取次數最小的t,判斷係數r是否能被x整除,

如果不可以表示這個t就是我們要找的分子的t,

否則就將r中一個x乘到x^t上去,也就是將r/x加到x^(t+1)的係數上去,直到找到一個最小的t並且r%x!=0

這個過程就像那種三個空瓶可以換一瓶新飲料那樣,喝完後新的空瓶加上原來的空瓶再去換。

這樣我們就找到分子和分母的最大次數,取兩者的最小值,再用快速冪就能求出答案了。

#include<cstdio>
#include<map>
using namespace std;
#define MOD 1000000007
#define LL __int64
int n, i;
LL a[100000], x, s, t, r;
map<LL,LL> MP;
map<LL,LL>::iterator it;
void solve(){
	LL ans=1;
	while(s>0){
		if(s%2==1)	ans = (ans*x)%MOD;
		x = (x*x)%MOD;
		s/=2;
	}
	printf("%I64d\n", ans);
}
int main(){
	while(~scanf("%d %I64d", &n, &x)){
		MP.clear();
		s=0;
		for(i=0; i<n; i++){
			scanf("%I64d", &a[i]);
			s+=a[i];
		}
		for(i=0; i<n; i++){
			MP[s-a[i]]++;
		}
		while(1){
			it = MP.begin();
			t = it->first;
			r = it->second;
			MP.erase(t);
			if(r%x>0){
				if(t<s)	s=t;
				solve();
				break;
			}
			r/=x;
			t++;
			MP[t]+=r;
		}
	}
	return 0;
}


相關推薦

Codeforces —— 359C Prime Number

很有趣的一個數論題。 題目要求的是分子和分母的最大公約數,但因為x是素數,所以其實就是要將分子和分母都表示成(x^k)*m,m不能被x整除,然後取分子和分母k的最小值。 對於分母,題目已經限定好就是x^s,s=a1+a2+...+an 所以關鍵點就是處理分子那一部分。 首先

JD 題目1040:Prime Number (篩法求素數)

rime 簡單 set end std tdi href num mod OJ題目:click here~~ 題目分析:輸出第k個素數 貼這麽簡單的題目,目的不清純 用篩法求素數的基本思想是:把從1開始的、某一範圍內的正整數從小到大順序排列

AOJ 0009 Prime Number

ont eve oid std splay 線性時間 red lin adding 題意:給出n,求不大於n的素數有多少個。 算法:先用線性時間復雜度的篩法打素數表,對於每個輸入統計不超過的素數個數。 #include <cstdio> int p[100

[LeetCode] Prime Number of Set Bits in Binary Representation

pri return not prim 統計 all bits clu leet Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a p

762. Prime Number of Set Bits in Binary Representation 二進制表示形式中的素數位數

num number uri auto func href order ger xpl Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having

CodeForces - 805D Minimum number of steps

mini png turn 增加 include blog 裏的 nbsp style 題目大意:把一個串裏的ab改為bba,求最少改幾次就沒有ab了 具體思路:可以把一次操作看成把a放到b右邊,再增加一個b,要求把所有的a都移到b右邊 發現1個a過一個b要1次操作 2

762. Prime Number of Set Bits in Binary Representation二進制中有質數個1的數量

nta 圖片 rime slist 代碼風格 輸出 -s turn 特殊 [抄題]: Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a

Codeforces 980E The Number Games (貪心 + 倍增)

任重而道遠 The nation of Panel holds an annual show called The Number Games, where each district in the nation will be represented by one contestant. T

Leetcode762.Prime Number of Set Bits in Binary Representation二進位制表示中質數個計算置位

給定兩個整數 L 和 R ,找到閉區間 [L, R] 範圍內,計算置位位數為質數的整數個數。 (注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算

CodeForces - 271B Prime Matrix (素數打表)

You've got an n × m matrix. The matrix consists of integers. In one move, you can apply a single transformation to the matrix: choose an

CodeForces - 27E】Number With The Given Amount Of Divisors (數論,數學,反素數)

題幹: Given the number n, find the smallest positive integer which has exactly n divisors. It is guaranteed that for the given n

LeetCode-Java-762. Prime Number of Set Bits in Binary Representation

題目 Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a pri

LeetCode-Prime Number of Set Bits in Binary Representation

Description: Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bit

【LeetCode】762. Prime Number of Set Bits in Binary Representation(C++)

題目: Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in the

Codeforces 912E Prime Gift 分段列舉+二分

題意:給定包含n個數的素數集合a[] ,定義一個新的集合,其中除一以外的所有的數的因子必須是a集合中的,而且按順序排放;求第k個數;思路:首先給定的a[] 長度是17不大但是沒辦法列舉所有的可能,我們可以想到分段列舉來降低複雜度;將a[] 分成兩段,分別求出所有小於1e18的

LeetCode-762. Prime Number of Set Bits in Binary Representation

Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in th

【LeetCode】762. Prime Number of Set Bits in Binary Representation

Prime Number of Set Bits in Binary Representation Problem Example Solution 一堆題放一塊太擠了,還是分開放=.=,也能寫得詳細一點 Problem

[LeetCode] Prime Number of Set Bits in Binary Representation 二進位制表示中的非零位個數為質數

Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation.

LeetCode 762. 762. Prime Number of Set Bits in Binary Representation

題目連結:二進位制表示中質數個計算置位 - 力扣 (LeetCode) Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime numbe

學以致用——Java原始碼——任意範圍內的素數列印(Prime Number display)

看起來很簡單的一個程式,寫起來咋就這麼費時間呢?或許這就是所謂的知易行難吧。 當上限增加到10萬時(即,輸出10萬以內的所有素數時,方法1用時約為方法2的四分之一)。選擇一個優化的演算法有時很重要! 原始碼: package exercises.ch6Methods; //JHT