1. 程式人生 > >codeforces837E Vasya's Function

codeforces837E Vasya's Function

設f(x,y),若y=0,則f(x,0)=0,否則f(x,y)=f(x,y-gcd(x,y))。
資料範圍是1<=x,y<=1012所以不能指望暴力(沒錯,3點就會T)
那麼來分析一下。
不妨設x=A·gcd(x,y),y=B·gcd(x,y)。那麼,一次操作後,x=A·gcd(x,y),y=(B-1)·gcd(x,y),顯然gcd(x,y)是兩個的因數之一。現在我們進行k次操作,x=A·gcd(x,y)不變,y=(B-k)·gcd(x,y),假設此時恰好gcd(A·gcd(x,y),(B-k)·gcd(x,y))改變,就意味著:gcd(A,B-k)不為1.
現在的問題就是如何求出k,因為如果知道k,我們就可以很快速的求出操作的次數。如果列舉的話一定會T,我們來稍微變個形:假定r為A的一個因子,那麼(B-k)%r=0.不妨設(B-k)=q*r,則B=q*r+k,即B%r=k%r.因為k一定小於r,因為如果k大於等於r,一定存在k-r使(B-(k-r))%r=0,這與k最小相矛盾。所以,B%r=k。我們只需要在O(n

)的時間內枚舉出所有的因子,然後跑就可以。
這樣的話思路的確是正確的,不過12點就T了。仔細想了一下,這樣寫會反覆呼叫查詢因子的函式,效率會非常低。那如何改進呢?
我研究了半天別人的程式碼,發現了一個非常巧妙的辦法。首先我們先讓x,y除gcd(x,y),此時的x的所有因子沒有公共因子。那麼我們就可以只枚舉出此時x所有素數因子。
而由於x為定值,我們就可以在每一次操作之後的篩選中從已經篩選過的因子中再次篩選,如果某個因子是操作後y的因子,那麼就不列為下次操作的考慮物件。否則就讓y除以這些因子,因為這就相當於讓y除以gcd(x,y).

#include <iostream>
#include <vector>
#include <algorithm> #define MAXN 1e14 typedef long long LL; using namespace std; LL x,y,g,t; vector<LL> va; vector<LL>::iterator it; LL gcd(LL x,LL y){ return y==0?x:gcd(y,x%y); } LL init(){ g=gcd(x,y); x=x/g,y=y/g; for(LL i=2;i*i<=x;++i){ while(x%i==0){ va.push_back(i); x/=i; } } if
(x>1) va.push_back(x); } void work(LL y){ if(y==0) return; LL k=y; for(it=va.begin();it!=va.end();++it){ k=min(k,y%(*it)); } t+=k,y-=k; vector<LL> vb; for(it=va.begin();it!=va.end();++it){ if(y%(*it)!=0) vb.push_back(*it); else y/=(*it); } swap(va,vb); work(y); } int main(){ cin>>x>>y; init(); work(y); cout<<t; }

數論太難了orz……

相關推薦

codeforces837E Vasya's Function

設f(x,y),若y=0,則f(x,0)=0,否則f(x,y)=f(x,y-gcd(x,y))。 資料範圍是1<=x,y<=1012所以不能指望暴力(沒錯,3點就會T) 那麼來分析一下。 不妨設x=A·gcd(x,y),y=B·gcd(

Codeforces 837E Vasya's Function:數論入門初步

題意:定義F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b)。給定 x 和 y (<=1e12)求F(x,y)。 題解:a=A*GCD(a,b) b=B*GCD(a,b),那麼b-GCD(a,b) = (B-1)*GCD(a,b),如果此

CF837E-Vasya's Function

time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandar

HOJ 10444 The milliard Vasya's function(簡單揹包)

在不大於1000000000的數裡,各個數位上的數字之和為s的數有多少個。 很容易想到通過揹包來做,但是如果只是簡單按數位遞推,如何排除0112和112這種重複的情況呢? 處理的辦法是不把0作為物品,但位數i不僅僅從i-1遞推,而是從0到i-1都要統計進來。 #includ

Educational Codeforces Round 26-E-Vasya's Function(思維)

題意:見體面,就是求f(x,y)題解:假如我們模擬遞推肯定炸,因為x和y有1e12這麼大,因此我們要看看這裡邊是否存在著無用功,首先因為每次b都會減掉一個gcd(a,b),我們可以將a和b分別寫成x1*

Milliard Vasya's Function(Ural_1353)

Vasya is the beginning mathematician. He decided to make an important contribution to the science and to become famous all over the

CodeForces - 837E - Vasya's Function | Educational Codeforces Round 26

mes def using pac main code names codeforce ces /* CodeForces - 837E - Vasya‘s Function [ 數論 ] | Educational Codeforces Round 26 題意

TimusOJ - 1353. Milliard Vasya's Function(DP)

TimusOJ - 1353. Milliard Vasya’s Function(DP) 題目連結 題目 求1到109 ( [1, 109] )中各位數字之和為S的數有多少個; 解析 這個題目和LeetCode - 518. Coin Change 2非常的相

matlab中s-function函式的使用

   在matlab的workspace裡打edit sfuntmpl(這是matlab自己提供的s函式模板),我們看它來具體分析s函式的結構。 它的第一行是這樣的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)   先講輸入與輸出變數的含義:t是取樣時間,x是狀

NBUT校賽 J Alex’s Foolish Function(分塊+延遲標記)

not unit itl 標記 ccf 一次 pan -s foo Problem J: Alex’s Foolish Function Time Limit: 8 Sec Memory Limit: 128 MB Submit: 18 Solve

Vasya and Petya's Game CodeForces

問序列中最少含幾個數 使得1-n的每一個數都能用序列中的幾個數相乘得到 把每個數都素因子分解為(2^p1)*(3^p2)*(5^p3)...這種形式 把2^1...2^p1等都扔數組裡去個重就好 #include <bits/stdc++.h> usi

檢視檢視報錯ERROR 1356 (HY000): View 'bdi_gj1121.y' references invalid table(s) or column(s) or function

問題說明: 業務說匯入的新資料庫有幾個檢視查不了,報錯: mysql> select count(*) from bdi_gj1121.beaf_company;ERROR 1356 (HY000): View 'bdi_gj1121.beaf_company' references

Given two strings s and t, write a function to determine if t is an anagram of s.

Given two strings s and t, write a function to determine if t is an anagram of s. For example, s = "anagram", t = "nagaram", return tru

Python's range() Function (Guide) – Real Python

Python’s built-in range function is handy when you need to perform an action a specific number of times. By the end of this article, you’ll: Understand

Practice Go: Function Frequency @ Alex Pliutau's Blog

Function Frequency Given a valid Go code in gocode.txt file find top-3 used functions. Don’t count function declaration. This is a static a

jQuery提交表單報錯 Uncaught TypeError: s[y] is not a function

使用jQuery提交表單的時候,頁面沒有反應,F12除錯發現點選提交按鈕,控制檯報錯 Uncaught TypeError: s[y] is not a function 問了百老師:發現可能是在form表單裡面 有一個input的id=“submit”,修改後,成功解決。

UVA - 434 Matty&#39;s Blocks

mes [0 () block += tty scan 一個 ems 題意:給你正視和側視圖,求最多多少個,最少多少個 思路:貪心的思想。求最少的時候:由於能夠想象著移動,盡量讓兩個視圖的重疊。所以我們統計每一個視圖不同高度的個數。然後計算。至於的話。就是每次拿正視圖的

Call to undefined function ThinkC()

erro debug 開啟 runt time ear efi div ron Fatal error: Call to undefined function Think\C() in /alidata/www/default/2017/newyear/simplewin

Function類型

引用 arguments 發生 能夠 特定 -1 算法 function cnblogs 在ECMAScript中, Function(函數)類型實際上是對象。每個函數都是 Function類型的實例, 而且都與其他引用類型一樣具有屬性和方法。 由於函數是對象, 因此函數名

C/s模式&&B/S模式

http client ref 最大 aid 都是 信息 管理系 電子商務網 C/s模式:是客戶端/服務器(Client/Server)模式,主要指的是傳統的桌面級的應用程序。比如我們經常用的信息管理系統。 C/S 客戶端/服務器 例如QQ,網絡遊戲,需要下載客戶端才能訪