zoukankan      html  css  js  c++  java
  • Atcoder ABC 161 F Division or Substraction 思维+数学

    Atcoder ABC 161 F Division or Substraction

    题意

    给一个正数n(<=1e12)在[2,n] 中取一个k 执行以下步骤:要求n一直大于kif n%k==0:n/=k ,else n-=k问有几个k满足进行这个步骤后剩下的数是1

    题解

    很套路的题我都不会,我真是太菜了QAQ 1e12 看起来就很根号,根号可以想到质因子或者因子,这题算一下样例就知道和质因子没啥关系所以往因子方面想,一个很简单的思路,我们可以把n拆成(n-1+1)那么只要是n-1的因数,并且不是n的因数,那么就会一直减,直到减完n-1,因为两边同时减一个数模数是不会变得,所以会一直减,直到剩1。n-1的因子算完了,其实n的因子也有可能性,把n唯一分解,假如用n的因数一直除到不能除,也就是没有质因子满足条件,这个时候 剩余值%因子如果等于1。那么n和n-1的因数就算完了,除了这两个数,别的数有没有可能呢,例如n-2的因数非n-1的因数 显然不可能,因为n-2的因数会把n-2给减完 剩余2 ,所以这题就写完了。

    #include<bits/stdc++.h>
    using namespace std;
    #define pb push_back
    #define F first
    #define S second
    #define mkp make_pair
    #define pii pair<int,int>
    typedef long long ll;
    const int inf=0x3f3f3f3f;
    const int maxn=2e5+200;
    
    int main(){
    	ll n;
    	cin>>n;
    	vector<ll>a,b;
    	for(int i=2;i<=sqrt(n);i++){
    		if(n%i==0){
    			a.pb(i);
    			if(n/i!=i)a.pb(n/i);
    		}
    	}
    	a.pb(n);
    	for(int i=2;i<=sqrt(n-1);i++){
    		if((n-1)%i==0){
    			b.pb(i);
    			if((n-1)/i!=i)b.pb((n-1)/i);
    		}
    	}
    	b.pb(n-1);
    	ll cnt=0;
    	for(auto p:b){
    		if(n%p){
    			cnt++;
    		}
    	}
    	for(auto p:a){
    		ll tmp=n;
    		while(tmp%p==0)tmp/=p;
    		if(tmp%p==1)cnt++;
    	}
    	cout<<cnt<<endl;
    }
    
    
    
  • 相关阅读:
    [HNOI2006]鬼谷子的钱袋
    一日游与两道题
    [HNOI2009]梦幻布丁
    [Ahoi2009]self 同类分布
    50 days before NOI2017
    Topcoder SRM 606 div1题解
    Topcoder SRM 605 div1 题解
    Topcoder SRM 604 div1题解
    Topcoder SRM 603 div1题解
    Topcoder SRM 602 div1题解
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/12642244.html
Copyright © 2011-2022 走看看